[sudhir.tataraju.WBLL0717E4418] ? cat test.sh
#!bin/bash
i=2
value2=abc
echo "`$value$i`"
Run Code Online (Sandbox Code Playgroud)
输出:
[sudhir.tataraju.WBLL0717E4418] ? sh test.sh
test.sh: line 8: 2: command not found
Run Code Online (Sandbox Code Playgroud)
调试输出:
[sudhir.tataraju.WBLL0717E4418] ? sh -x test.sh
+ i=2
+ value2=abc
++ 2
test.sh: line 8: 2: command not found
+ echo ''
Run Code Online (Sandbox Code Playgroud)
如何获得输出abc没有错误?
使用数组可以更好地实现您要做的事情.
values=( value1 value2 value3 "This is value 4" )
echo "${values[2]}"
values[2]="other_value"
echo "${values[2]}"
Run Code Online (Sandbox Code Playgroud)
变量也可以用作索引:
i=2
echo "${values[$i]}"
Run Code Online (Sandbox Code Playgroud)
数组很容易在值上循环:
#looping over values
for value in "${values[@]}"; do
echo "$value"
done
#looping over indexes
for index in "${!values[@]}"; do
echo "${values[$index]}"
done
Run Code Online (Sandbox Code Playgroud)
如果您不考虑稀疏或关联数组,您也可以像这样循环:
for (( index=0; index<${#values[@]}; index++ )); do
echo "${values[index]}"
done
Run Code Online (Sandbox Code Playgroud)
数组是适合您任务的正确结构.它们提供强大的功能.有关数组的更多信息,请参阅:wiki.bash-hackers.org/syntax/arrays和Bash参考手册.
您要求的可以通过两种方式实现(没有反模式或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}"
Run Code Online (Sandbox Code Playgroud)意识到你的设计非常糟糕,并使用一些适当的结构:Bash处理数组.见Pesa的回答.在您的情况下,这绝对是推荐的方法.
不要用eval.虽然它看起来很棒,但在了解所有问题之前,需要大量的shell脚本练习eval.当你有足够的Bash经验时,你会意识到你很少需要eval.
ope*_*kix -2
这是一个完整的有效示例
#!/bin/bash
val1='foo'
val2='bar'
val3='baz'
for i in {1..3}
do
eval echo "\$val${i}"
done
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
611 次 |
| 最近记录: |