2010-04-14 89 views
17
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://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean)。 – codeforester 2018-01-24 17:17:07

回答

22

見猛砸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

2

如果你有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] 
    } 
}' 
1

試試這個:

eval echo \$c$x 

像其他人說,它更有意義在這種情況下使用數組。

+1

從安全的角度來看,使用eval時不進行適當的引用(與'printf%q'一樣)是相當危險的,特別是如果腳本正在處理任何可能由惡意或不可信進程產生的數據。 (甚至一個文件名可能被用來注入惡意內容,如果這是你正在循環)。 – 2011-11-17 14:27:37