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

(“=”是字段分隔符)

我读取每个寄存器的第一个字段并将它们存储在一个数组中,对于每个寄存器的第二个字段也是如此:

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

这给了我两个这样的数组: (foo1 foo2 foo3) 和 (32 54 912)

是否可以动态创建名为 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 回答