x=1
c1=string1
c2=string2
c3=string3
echo $c1
string1
我想有輸出是string1
使用類似: echo $(c($x))
參考另一個變量猛砸
所以在劇本後,我可以遞增的x
價值和輸出string1
,然後string2
和string3
。
任何人都可以指向正確的方向嗎?
x=1
c1=string1
c2=string2
c3=string3
echo $c1
string1
我想有輸出是string1
使用類似: echo $(c($x))
參考另一個變量猛砸
所以在劇本後,我可以遞增的x
價值和輸出string1
,然後string2
和string3
。
任何人都可以指向正確的方向嗎?
見猛砸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
。
優秀。編輯後,它變得晶瑩剔透,是我的首選。非常感謝您的時間和知識。 – 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
像其他人說,它更有意義在這種情況下使用數組。
從安全的角度來看,使用eval時不進行適當的引用(與'printf%q'一樣)是相當危險的,特別是如果腳本正在處理任何可能由惡意或不可信進程產生的數據。 (甚至一個文件名可能被用來注入惡意內容,如果這是你正在循環)。 – 2011-11-17 14:27:37
使用數組。閱讀「男人bash」。 – 2010-04-14 03:02:01
我有完全相同的問題。 – User1 2010-07-27 20:42:57
請參閱[在Bash中的間接變量](https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean)。 – codeforester 2018-01-24 17:17:07