扩展变量Bash脚本
bash中有两个变量,它们完成了另一个变量的名称,我想对其进行扩展,但不知道如何进行扩展 我有:扩展变量Bash脚本,bash,variables,scripting,Bash,Variables,Scripting,bash中有两个变量,它们完成了另一个变量的名称,我想对其进行扩展,但不知道如何进行扩展 我有: 我想以这种形式展开${a10},${$sala$I},但显然{}scape是$符号。使用eval eval "echo \${$sala$i}" 将该值放入另一个变量中 result=$(eval "echo \${$sala$i}") 有几种方法,各有优缺点。最安全的方法是将完整的参数名保存在单个参数中,然后使用间接方式将其展开: tmp="$sala$i" # sets $tm
我想以这种形式展开
${a10}
,${$sala$I}
,但显然{}
scape是$
符号。使用eval
eval "echo \${$sala$i}"
将该值放入另一个变量中
result=$(eval "echo \${$sala$i}")
有几种方法,各有优缺点。最安全的方法是将完整的参数名保存在单个参数中,然后使用间接方式将其展开:
tmp="$sala$i" # sets $tmp to 'a10'
echo "${!tmp}" # prints the parameter named by $tmp, namely $a10
一种稍微简单的方法是这样的命令:
eval echo \${$sala$i}
它将使用参数
echo
和${a10}
运行eval
,从而运行echo${a10}
。一般来说,这种方法不太安全——它的行为更多地依赖于参数的值——但它不需要临时变量。通常的答案是eval
:
result=$(eval "echo \${$sala$i}")
sala=a
i=10
a10=37
eval echo "\$$sala$i"
这与第37条相呼应。如果愿意,您可以使用“\${$sala$i}”
当心
eval
,尤其是当您需要在参数列表中保留空格时。它非常强大,也非常令人困惑。它将与旧Shell和Bash一起使用,这在您眼中可能是优点,也可能不是优点。您可以通过间接方式完成:
$ a10=blah
$ sala=a
$ i=10
$ ref="${sala}${i}"
$ echo $ref
a10
$ echo ${!ref}
blah
但是,如果你有这样的索引。。。数组可能更合适:
$ declare -a a
$ i=10
$ a[$i]="test"
$ echo ${a[$i]}
test
你在做什么?听起来你需要一个数组。@user1236560:不客气!但是现在我看到一些人建议你使用一个数组,我认为这是个好主意:不要让变量名为
$a10
,$b7
,诸如此类——如果你是这样的话——你可以用一个名为arr
的数组,它的索引像'a10'
和'b7'
等等。这将使您可以简单地编写“${arr[$sala$i]}”
。这不起作用,因为我不能在array@user1236560:是的,我一点也不惊讶。Bash只在版本4.0中添加了对例如${arr[a10]}
的支持,并且许多机器仍在运行3.x版本。