过去2/3天我遇到了这个问题。我有一个简单的脚本,我将读取属性文件并输出一些内容。这是我的剧本
vi testloop.properties
dump_1=abc
vi testloop.sh
. testloop.properties
i=1
dmp="dump_"$i //as per my understanding dmp=dump_1
echo $dump_1 //abc will echod since dump_1 in property file is abc
echo $dmp ***i thought here also abc will come but unfortunately it is "dump_1"***
echo $(($dmp)) ***here output is 0***
sh testloop.sh
abc
dump_1
0
有人可以帮我指出echo $ dmp和echo $(($ dmp))中发生了什么。为什么它不回应abc
答案 0 :(得分:2)
. ./testloop.properties
i=1
dmp="dump_"$i
echo $dump_1 # print abc as expected
echo $dmp # prints dump_1 since this is what dmp contains
# ***here output is 0***
eval echo \$$dmp # evaluates \$$dmp to $dump1 then echoes abc
对于echo $(($dmp))
,它会尝试评估arithmetic expression,结果为0:
算术扩展允许评估算术表达式 并取代结果。算术格式 扩展是:
$((表达式))
答案 1 :(得分:2)
如果你的shell是bash,请使用间接参数扩展。
echo ${!dmp}
记录here
如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值。这被称为间接扩张。
但是,使用@FoolishSeth所示的数组通常比构造动态变量名更整洁。
答案 2 :(得分:1)
dmp="dump_"$i
这会将字符串"dump_1"
而不是变量dump_1
分配给dmp
。
你给出的另一个例子试图对$dmp
进行算术扩展,在这种情况下只是0。
通常,变量赋值为dmp=$dump_1
,这很好,但变量赋值变量,即dmp=$dump_$i
不能正常工作。您可以通过eval
声明传递它:
eval dmp=\$dump_$1
但是如果你真的需要这种性质的变量变量,那么使用数组可能会更好:
i=1
dump[1]='abc'
dmp=${dump[$i]}
echo ${dump[$i]}
echo $dmp