扩展变量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

bash中有两个变量,它们完成了另一个变量的名称,我想对其进行扩展,但不知道如何进行扩展 我有:


我想以这种形式展开
${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版本。