2013-06-19 33 views
10

如何在bash循環中使用變量? 如果我只是用for循環標準,它做什麼,我希望如何在bash循環中使用變量

for i in {0..3} 
do 
    echo "do some stuff $i" 
done 

這工作得很好。它循環4次,包括0到3,打印我的信息,並把計數結束。

do some stuff 0 
do some stuff 1 
do some stuff 2 
do some stuff 3 

當我嘗試以下for循環的同樣的事情,它似乎等於一個字符串,這不是我想要的。

length=3 
for i in {0..$length} 
do 
    echo "do something right $i" 
done 

輸出:

do something right {0..3} 

我已經試過

for i in {0.."$length"} and for i in {0..${length}} (both output was {0..3}) 

for i in {0..'$length'} (output was {0..$length}) 

,他們都沒有做什麼,我需要。希望有人能幫助我。在此先感謝任何bash專家對for循環的幫助。使用eval

回答

12

方式一:

for i in $(eval echo {0..$length}) 
do 
     echo "do something right $i" 
done 

當你設置length=;lslength=; rm *(不要嘗試,雖然後者)會發生什麼。

安全,使用seq

for i in $(seq 0 $length) 
do 
     echo "do something right $i" 
done 

,或者您可以使用C風格的for循環,這也是安全:

for ((i = 0; i <= $length; i++)) 
do 
     echo "do something right $i" 
done 
+3

+1不是'eval'的粉絲,而是像你在這個答案中給出各種選擇的方式。 –

+1

C式循環顯然是最好的選擇。 –

4

在bash,括號展開是第一嘗試這樣做,那時,$length將不會被替換。

爲了清楚地bash的狀態的手冊頁:

序列表達式的形式爲{x..y [.. INCR]},其中x和y是任一整數或單個字符 ...

有多種可能性,比如使用:

pax> for i in $(seq 0 $length) ; do echo $i ; done 
0 
1 
2 
3 

儘管這可能會給你一個大的命令行如果length是巨大的。

另一種方法是使用類似C的語法:

pax> for ((i = 0; i <= $length; i++)) ; do echo $i; done 
0 
1 
2 
3 
3

佈雷斯subtitutions在任何其他被執行,所以你需要使用eval或 第三方工具,如seq

示例EVAL:

for i in `eval echo {0..$length}`; do echo $i; done 

此信息實際上可以man bash找到:

序列表達式的形式爲{x..y [.. INCR]},其中x和y是 整數或單個字符,並且incr(可選增量)是整數。

在任何其他擴展之前執行括號擴展,並且在結果中保留任何其他擴展的字符 。這是嚴格的文本。 Bash不會對擴展 或大括號之間的文本應用任何語法解釋。