我正在学习bash,并希望做一些非常简单的事情,这是我的剧本:
train()
在#!/bin/bash
#read-multiple: reads multiple values from keyboard
echo -n "Enter one or more values:"
read var1 var2 var3 var4 var5
for i in {1..5}
do
echo var$i= ${var"$i"}
done
循环中,我尝试打印到用户输入的值,只有for
行才会出错:
echo
我期待发生的事情是:
${var"$i"}: bad substitution
扩展为1到5之间的当前值(例如1)$i
扩展为$ {var1},扩展为var1 显然情况并非如此......你能解释一下为什么会这样吗? bash会立刻扩展一线上的所有内容吗?
我也尝试了${var"$i"}
和${var${$i}}
,但两者都给出了同样的错误......为什么会这样?
答案 0 :(得分:2)
你可以这样做:
for v in var{1..5}; do
echo $v = ${!v}
done
或
for i in {1..5}; do
v="var$i"
echo $v = ${!v}
done
见这篇文章:
此处的文档:
答案 1 :(得分:-2)
问题是${..$..}
。一般来说,你总是可以避免它。
理论上,如果你真的想以这种方式进行评估,你就不能按照自己的方式进行评估。你期待两个替换,一个接一个。使用eval
来获取此行为,但请注意,您希望仅在第二次运行中评估其中一个$
:
#!/bin/bash
#read-multiple: reads multiple values from keyboard
echo -n "Enter one or more values:"
read var1 var2 var3 var4 var5
for i in {1..5}
do
eval echo var$i= \${var$i}
done
请注意反斜杠以防止$
的初始扩展。我强烈建议不要这样做(使用eval
)。检查@codeforesters替代方法来废弃这个。即使他使用不同的方法,对你的特定脚本更好(得到我的投票)。
为了未来读者的利益:这是非常糟糕的编码习惯。我无法想象你无法避免${..$..}
构造的情况。如果你必须,我认为你需要eval
。