これら2つのforループスタイルの表現内容に違いはありますか?

これら2つのforループスタイルの表現内容に違いはありますか?

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

(( ))整数の繰り返しは、;各部分(除算)内に「算術式」があるため、これを行う必要があります。

これはcfor ループに似ており、開始、終了、および「ステップの動作」を 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

単語リストはシェル分割の影響を受けます。これは以前の構成では問題ではありません。

関連情報