[sudhir.tataraju.WBLL0717E4418] ➤ cat test.sh
#!bin/bash
i=2
value2=abc
echo "`$value$i`"
输出:
[sudhir.tataraju.WBLL0717E4418] ➤ sh test.sh
test.sh: line 8: 2: command not found
调试输出:
[sudhir.tataraju.WBLL0717E4418] ➤ sh -x test.sh
+ i=2
+ value2=abc
++ 2
test.sh: line 8: 2: command not found
+ echo ''
如何输出 abc 而不出错?
答案 0 :(得分:6)
使用数组可以更好地实现您想要做的事情。
values=( value1 value2 value3 "This is value 4" )
echo "${values[2]}"
values[2]="other_value"
echo "${values[2]}"
变量也可以用作索引:
i=2
echo "${values[$i]}"
数组很容易在值上循环:
#looping over values
for value in "${values[@]}"; do
echo "$value"
done
#looping over indexes
for index in "${!values[@]}"; do
echo "${values[$index]}"
done
如果不考虑稀疏或关联数组,也可以像这样循环:
for (( index=0; index<${#values[@]}; index++ )); do
echo "${values[index]}"
done
数组是适合您任务的正确结构。它们提供强大的功能。有关数组的详细信息,请参阅:wiki.bash-hackers.org/syntax/arrays和Bash Reference Manual。
答案 1 :(得分:6)
您要求的内容可以通过两种方式实现(没有反模式或eval
)。
参数扩展的基本形式是
${parameter}
。参数的值被替换。 [...] 如果参数的第一个字符是感叹号(!), [...]它会引入一个变量间接的级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并在替换的其余部分使用该值,而不是参数的值本身。这称为间接扩展。
所以你想要的是:
#!/bin/bash
i=2
value2=abc
# Have a variable that expands to the name of the variable you want
myvar=value$i
# Use indirect expansion
echo "${!myvar}"
意识到你的设计非常糟糕,而是使用一些适当的结构:Bash处理数组。见PesaThe's answer。在您的情况下,这绝对是推荐的方法。
不要使用eval
。虽然它可能看起来很棒,但在了解eval
的所有问题之前,您需要大量的shell脚本练习。当你有足够的Bash经验时,你会意识到你很少需要eval
。
答案 2 :(得分:0)
另一种解决方案,使用 nameref :
i=2
value2="abc"
declare -n essai=value"$i"
echo "$essai"
答案 3 :(得分:-1)
使用eval
:
eval echo "\$value$i"
来自help eval
:
eval: eval [arg ...] Execute arguments as a shell command. Combine ARGs into a single string, use the result as input to the shell, and execute the resulting commands.
因此命令首先扩展为
eval echo "$value2"
请注意,第一个美元已转义,因此不会展开为$value
然后eval
生效:再次评估整个命令:
echo "abc"
根据需要输出:abc
答案 4 :(得分:-3)
这是一个有效的完整示例
#!/bin/bash
val1='foo'
val2='bar'
val3='baz'
for i in {1..3}
do
eval echo "\$val${i}"
done