- ベストアンサー
forとwhileの区別の仕方
リナックスのシェルで, forとwhileの区別がいまひとつ理解ができません。 イメージで何かいいアイデアがあれば、 お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
全然違うじゃないと思ったのですが、bash拡張の for((expr1; expr2; expr3)) とwhileの比較の話なんでしょうか。元々、シェルのforは、 (1) シェルスクリプトの引数を順に処理する for i;do echo "<<$i>>";done (2) 単語の並びを順に処理する for i in *.c;do cp $i back/$i;done の2パターンでしたので、whileとの使い分けは明確でした。 その後、C言語からの輸入の形でbashにfor((expr1; expr2; expr3)) の形式が出来ました。わかりにくいということあれば、この新しい形式のforは一切使わないことにすればわかりやすいのではないでしょうか。数字を1から100までとかの場合だけに限定するとか。 もし、C言語をご存知なら、Cでの基準と同じにすればいいし。
その他の回答 (2)
- m_mik
- ベストアンサー率26% (31/117)
自分の例で申し訳ないですが… forはループ変数の初期値設定、ループ変数に関連する条件、ループ値の変化という形で組めるループで使用しています。 対してwhileは初期値が付近の処理では設定されていない場合のループ(既に設定されている値を使用する場合)や、ループ値の変化が見えない場合のループ(他のところで値を変化させる場合)に使用しています。 また、forには単語リストによるループという特殊な使い方もあります。 test='abc def ghi jkl' for TANGO in $test ; do →こうすると、TANGO変数に abc,def,ghi,jklと入ってきます。
カーニハン&リッチーによれば、「for 自体はループであり、while の一般化になっている」ということです。 リナックスのシェルにも、このCの規定が当てはまると思います。 まあ、for が犬ならば while はハスキーというイメージじゃないでしょうか?
補足
ご返答ありがとうございます。 forは順々に繰り返しを実行し、 whileは、条件式が真であれば、 ぐるぐる回っているということでしょうか?