替换中的Bash替换

时间:2017-10-18 17:39:51

标签: bash shell

我正在学习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

我期待发生的事情是:

  1. ${var"$i"}: bad substitution 扩展为1到5之间的当前值(例如1)
  2. $i扩展为$ {var1},扩展为var1
  3. 的值

    显然情况并非如此......你能解释一下为什么会这样吗? bash会立刻扩展一线上的所有内容吗?

    我也尝试了${var"$i"}${var${$i}},但两者都给出了同样的错误......为什么会这样?

2 个答案:

答案 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

相关问题