2013-06-19 16 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 

私はループのために、次のと同じことをしようとすると、私が望むものではない文字列を、等しくなるように思えます。

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ループを手伝ってくれてありがとうございます。

答えて

12

一つの方法evalを使用している:あなたはlength=;lsまたはlength=; rm *が(ただし、後者を試していない)に設定したときに何が起こるか

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

注意

安全seq使用:

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

か、また、安全である、ループのためのCスタイルを使用することができます。bashで

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

+1「eval」のファンではありませんが、この回答ではさまざまなオプションを指定するようにしています。 –

+1

Cスタイルのループは明らかに最適なオプションです。 –

4

、ブレース展開は最初ですステップが試行されたため、その時点で$lengthは置換されません。

バッシュ状態のマンページはっきり:

配列の発現がフォームとる{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のようなサードパーティ製のツールを使用する必要がありますされています。

評価するための例:

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

この情報は、実際man bashに見出すことができる:

配列の発現はフォーム{x..y [.. INCR]を}かかり、xとyは の整数または単一の文字のいずれかで、incr(オプションの増分)は整数です。 [...]

ブレースの展開は他の拡張の前に行われ、他の拡張に 特別な任意の文字が結果に保存されています。厳密にはテキストです。 Bashは、拡張のコンテキストに構文解釈を適用しません。 または中カッコ間のテキスト。

関連する問題