参考另一个变量猛砸

问题描述:

x=1 
c1=string1 
c2=string2 
c3=string3 

echo $c1 
string1 

我想有输出是string1使用类似: echo $(c($x))参考另一个变量猛砸

所以在剧本后,我可以递增的x价值和输出string1,然后string2string3

任何人都可以指向正确的方向吗?

+1

使用数组。阅读“男人bash”。 – 2010-04-14 03:02:01

+0

我有完全相同的问题。 – User1 2010-07-27 20:42:57

+0

请参阅[在Bash中的间接变量](https://*.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean)。 – codeforester 2018-01-24 17:17:07

见猛砸FAQ:How can I use variable variables (indirect variables, pointers, references) or associative arrays?

引述他们的榜样:

realvariable=contents 
ref=realvariable 
echo "${!ref}" # prints the contents of the real variable 

为了展示该方法适用于示例:

get_c() { local tmp; tmp="c$x"; printf %s "${!tmp}"; } 
x=1 
c1=string1 
c2=string2 
c3=string3 
echo "$(get_c)" 

如果,当然,你想要做的正确方法,只是use an array

c=("string1" "string2" "string3") 
x=1 
echo "${c[$x]}" 

注意,这些数组是零索引,所以用x=1它打印string2;如果你想string1,你需要x=0

+0

优秀。编辑后,它变得晶莹剔透,是我的首选。非常感谢您的时间和知识。 – user316100 2010-04-15 20:28:29

如果你有bash 4.0,你可以使用associative arrays.。或者您可以使用arrays。你可以使用另一个工具是AWK

awk 'BEGIN{ 
    c[1]="string1" 
    c[2]="string2" 
    c[3]="string3" 
    for(x=1;x<=3;x++){ 
    print c[x] 
    } 
}' 

试试这个:

eval echo \$c$x 

像其他人说,它更有意义在这种情况下使用数组。

+1

从安全的角度来看,使用eval时不进行适当的引用(与'printf%q'一样)是相当危险的,特别是如果脚本正在处理任何可能由恶意或不可信进程产生的数据。 (甚至一个文件名可能被用来注入恶意内容,如果这是你正在循环)。 – 2011-11-17 14:27:37