
forループには2つの構文スタイルがあります。
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
for name [ [in [words ...] ] ; ] do commands; done
一見すると、両方を表現できるループ型は互いに関係がないようです。 1つ目は算術式に基づいてループを表現できますが、2つ目はセットの列挙されたメンバーに基づいてループを表現できますwords
。
本質的に表現できるループの種類は実際に異なるのですか、それとも互いに同じですか?前者なら、いつどれを使うべきですか?
答え1
2番目の形式は常に有限であり、1番目の形式は単に無限に繰り返すことができます。
for ((;;)); do echo $SHELL; done
答え2
最初
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
確かに2番目よりも一般的です。
for name [ [in [words ...] ] ; ] do commands; done
なぜなら
- 式で使用される変数は配列インデックスとして使用できます(そして、2番目の項目で使用されている単語のリストから選択項目を取得します)。
- ただし、2番目の形式は変更されていない単語のリストを使用して段階的に進みます(ただし、最初の形式は次を使用します)。表現するループを終了するために使用されます。これは、ループ終了が同程度に予め決められていないことを意味する。
答え3
これ:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
(( ))
整数の繰り返しは、;
各部分(除算)内に「算術式」があるため、これを行う必要があります。
これはc
for ループに似ており、開始、終了、および「ステップの動作」を 1 行で定義して、より簡潔にします。
2番目は、数字、文字列、または配列である可能性がある単語のリストに対して機能します。
for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done
単語リストはシェル分割の影響を受けます。これは以前の構成では問題ではありません。