2

在过去的 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

4

3 回答 3

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)),它尝试计算一个算术表达式,结果为 0:

算术扩展允许对算术表达式求值并替换结果。算术展开的格式为:

$(( 表达式 ))

于 2012-12-03T06:53:23.073 回答
2

如果您的 shell 是 bash,请使用间接参数扩展。

echo ${!dmp}

记录在这里

如果参数的第一个字符是感叹号(!),则引入了变量间接级别。Bash 使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并将该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。

但是,使用 @FoolishSeth 所示的数组通常比构造动态变量名称更整洁。

于 2012-12-03T11:38:01.420 回答
1

dmp="dump_"$i

这会将字符串"dump_1"而不是变量分配dump_1dmp.

您给出的另一个示例尝试进行算术扩展$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
于 2012-12-03T07:11:00.613 回答