我有文件“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]}
但我想动态获取变量的名称,关于我从文件中获取的名称。
答案 0 :(得分: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
答案 1 :(得分:3)
如果值没有空格(如示例中所示)或用引号括起来,这就像“获取”文件一样简单。
source Testfile
这将基本上“运行”文件,在这种情况下只定义一些变量并返回。
答案 2 :(得分: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[@]}"