是否可以在bash中从其他变量构建变量名?

时间:2010-10-18 21:20:08

标签: bash variables

我为这个非常可怕的标题道歉 - 以及质量差的帖子 - 但我基本上想做的是:

for I in 1 2 3 4
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc.

显然上面的内容不起作用 - 它会(我认为)尝试并回显一个名为$VAR$I的变量,这在Bash中是否可行?

7 个答案:

答案 0 :(得分:35)

是的,但不要这样做。改为使用数组。

如果你仍坚持这样做......

$ foo1=123
$ bar=foo1
$ echo "${!bar}"
123

答案 1 :(得分:10)

for I in 1 2 3 4 5; do
    TMP="VAR$I"
    echo ${!TMP}
done

我有一个通用规则,如果我需要间接访问变量(同上数组),那么是时候将脚本从shell转换为Perl / Python / etc。尽管可能很快就会在shell中进行高级编码变得一团糟。

答案 2 :(得分:4)

您应该考虑使用bash数组进行此类工作:

pax> set arr=(9 8 7 6)
pax> set idx=2
pax> echo ${arr[!idx]}
7

答案 3 :(得分:4)

对于您不想将变量重构为数组的情况......

单程......

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done

另一种方式......

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done

我还没有找到一种更简单的方法。例如,这不起作用......

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done
bash: ${!VAR$I}: bad substitution

答案 4 :(得分:3)

for I in {1..5}; do
    echo $((VAR$I))
done

答案 5 :(得分:1)

答案 6 :(得分:0)

这绝对看起来像阵列类型的情况。这是一个关于如何在bash中使用数组的非常好的讨论(有很多例子)的链接:Arrays