bash の while 文について
bash で書ける while文について触れておきます。
while 文の基本構文
while <COMMANDS> ; do <COMMANDS> done;
ここでの <COMMANDS>
は 複数行のコマンドリストのことを指しています。
COMMANDSに含まれるものは次のとおりです
COMMANDS
( COMMANDS; ) { COMMANDS ; } command ; command; command && command command || command command
ここで書いている command は一般コマンドのことで ((
も [
も [[
もcommandに含めます。
while の;
の書き方
改行で ;
が自動的に挿入されることを利用し、while を次のように記述する人も多いみたいです。
while <COMMANDS> do <COMMANDS> done
このように、;
の代わりに改行コードを書いたwhileでは、 do
のぶんだけ1行多くなる。
なので、この1行を減らそうと、改行を削除するももの;
の概念に気付かずSyntaxErrorで詰まる人をよく見かけたので注意してほしい。
色々みていたら、 bash を書くときは do
で一行浪費するより ; do
と書くことのほうが多いようです。*1
while の break
while には break が書ける。
while <COMMANDS> ; do <COMMANDS> break; done;
break は while や for のネストの数に応じて何個抜けるか書くことが出来る。 break N
で N段のネストを抜ける。
while <COMMANDS> ; do while <COMMANDS> ; do <COMMANDS> break 2; done; done;
while の continue
while文では continue も使える。continue を使うと、現在ループを途中で中断して次のループに入る。
while <COMMANDS> ; do if <COMMANDS>; then continue fi <COMMANDS> done;
untile構文
while と not を使えばいいので、あんまり出番がない。do-until はいまのところ存在しないみたい
until <COMMANDS> ; do <COMMANDS> done
until を使わずとも、 whileでも同じことです。
while ! <COMMANDS> ; do <COMMANDS> done
until における break や continue も while と同じです。
until使う意味あんの。。。
参考資料
http://wiki.bash-hackers.org/syntax/ccmd/while_loop
*1: ちなみに、昔のブログなどの記述を見てると do を改行するほうが多いような気がした。