1

ファイル「Testfile」があり、各行にレジスタがあり、各レジ​​スタにはいくつかのフィールドがあります。

foo1=32=test01=30/03/2012 10:03 p.m
foo2=54=test02=30/03/2012 10:05 p.m
foo3=912=test03=30/03/2012 10:08 p.m

(「=」はフィールド区切り文字です)

すべてのレジスタの最初のフィールドを読み取り、それらを配列に格納します。すべてのレジスタの 2 番目のフィールドについても同じです。

NAMES=(`cut -f1 -d'=' Testfile`)
VALUES=(`cut -f2 -d'=' Testfile`)

これにより、(foo1 foo2 foo3) と (32 54 912) のような 2 つの配列が得られます。

foo1 foo2 および foo3 という名前の変数を動的に作成し、それぞれの値を割り当てることは可能ですか?

私はそれをできた:

foo1 = ${VALUES[0]}
foo2 = ${VALUES[1]}
foo3 = ${VALUES[2]}

しかし、ファイルから取得した名前に関して、変数の名前を動的に取得したいと考えています。

4

3 に答える 3

4
cat Testfile 
foo1=35
foo2=54
foo3=912

for v in $(cat Testfile); do declare "$v"; done

echo $foo1 
35

echo $foo2 
54

ファイル内の行が次のように正確に見える場合に機能します。

var=val

スペースで動作するバージョンは次のとおりです。

cat Testfile
foo1 = 35
foo2 = 54
foo3 = 912

while read line; do
    if [ -z "$line" ]; then continue; fi
    var=$(echo $line | cut -d'=' -f1)
    val=$(echo $line | cut -d'=' -f2)
    declare "$(echo $var)=$(echo $val)"
done < Testfile

echo $foo1 
35
于 2012-10-04T04:42:36.137 に答える
3

値に (例のように) 空白がないか、引用符で囲まれている場合、これはファイルを「ソース」するのと同じくらい簡単です。

source Testfile

これは基本的にファイルを「実行」します。この場合、いくつかの変数を定義して返すだけです。

于 2012-10-04T05:21:44.733 に答える
1

これはあなたのために働くかもしれません(GNU sed):

NAMES_VALUES=($(sed 's/\(\S*\)\s*\(\S*\)\s*.*/\1=\2/' Testfile))
eval "${NAMES_VALUES[@]}"

編集:

ファイル形式が=区切り文字として使用する場合:

NAMES_VALUES=($(sed 's/^\([^=]*=[^=]*\)=.*/\1/' Testfile))
eval "${NAMES_VALUES[@]}"
于 2012-10-04T06:55:43.990 に答える