2010-10-18 112 views
27

我的非常可怕的標題道歉 - 和質量後差 - 但我基本上想要做的是這樣的:是否有可能從bash中的其他變量構建變量名?

for I in 1 2 3 4 
    echo $VAR$I # echo the contents of $VAR1, $VAR2, $VAR3, etc. 

顯然,上述方法無效 - 這將(我認爲)嘗試呼應名爲$VAR$I的變量這在Bash中可能嗎?

回答

33

是的,但不這樣做。改用數組。

如果你仍然堅持做這樣的說法......

$ foo1=123 
$ bar=foo1 
$ echo "${!bar}" 
123 
+5

+1但不這樣做。改用數組。 – Nifle 2010-10-18 21:25:12

+0

感謝您的建議陣列。使用你和pax的帖子,我設法讓它工作。乾杯。 – Stephen 2010-10-18 21:44:14

+0

它不適用於'kshell' – g4ur4v 2014-07-23 10:28:56

4

你應該考慮使用bash陣列進行這樣的工作:

pax> set arr=(9 8 7 6) 
pax> set idx=2 
pax> echo ${arr[!idx]} 
7 
0

這肯定看起來像一個數組類型的情況。這裏有一個如何使用數組在bash,有一個非常好的討論的鏈接(用許多實例):Arrays

10
for I in 1 2 3 4 5; do 
    TMP="VAR$I" 
    echo ${!TMP} 
done 

我有一個一般的規則,如果我需要間接訪問變量(同上陣列),那麼它是時候把腳本從shell轉換成Perl/Python /等。 shell中的高級編碼儘管可能很快變得混亂。

4

對於您不想重構你的變量成陣列的情況下...

的一種方式......

$ for I in 1 2 3 4; do TEMP=VAR$I ; echo ${!TEMP} ; done 

另一種方式......

$ for I in 1 2 3 4; do eval echo \$$(eval echo VAR$I) ; done 

我還沒找到更簡單的方法。例如,這不起作用...

$ for I in 1 2 3 4; do echo ${!VAR$I} ; done 
bash: ${!VAR$I}: bad substitution 
+1

我的答案的一部分以前是由@ Dummy00001發佈的 - 唯一一個真正回答問題的人。 – nobar 2014-04-02 16:16:05

1

是的。請參閱Advanced Bash-Scripting Guide

+0

在你的答案中抄錄鏈接頁面的某些部分直接理解本來是很好的......但這是一個很好的參考! – 2017-12-06 19:16:23

3
for I in {1..5}; do 
    echo $((VAR$I)) 
done 
相關問題