それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashのwhile/until ループ構文について

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 を改行するほうが多いような気がした。