UNIX/Linuxのシェルの1つであるbashのフロー制御構文には、if...elif...else文、while文とwhile文と条件が対になるuntil文、for文、case文、select文があり、その書式は下記の通りです。
bashのフロー制御構文は他のスクリプトやプログラム言語よりも柔軟な複数の記述方法があったり、bash固有の記述方法もあったりします。
bashフロー制御 | 条件式の例 | 書式サンプル |
---|---|---|
if...elif...else...fi | if condition if [ condition ] | if condition then command elif condition then command else command fi if condition then command elif condition then command else command fi |
while...do...done until...do...done | while condition while [ condition ] while command var while | while condition do command done while read line do command done < input |
for...do...done | for((i = 0; $i < 10; i++)) for var in val1 val2...valN for var in * for var in list for var in {1..3} for var | for(( i = 0; $i < 10; i++)) do command done for var in input do command done |
select...do...done | select list in var1 var2 ...varN | select list in var1 var2 do command done |
case...esac | case var in | case var in pattern1 ) command ;; pattern2 ) command ;; patternN ) command ;; esac |
* bashでは変数(例ではiやvarやlist等々)使用時は、
代入時に$は付加せず参照時に変数の先頭に$を付加
* if文とwhile文にある[ ]はBourne Shell組み込みコマンドのtestコマンド
test condition と記述しても同様、他に[[ ]]、( )、(( ))もある
* if...elif...else...fi文の、elif then文やelse文は省略も可
elifはPerlのようなelsifでもCのようなelse ifでもなくelif
* if文はfiで、case文はesacで閉じる
* select文は、これで自動的に標準出力に var1~varN をリスト表示
各選択肢は自動的に右カッコ付き番号に続いて表示される
回答受付行は環境変数PS3にセットされた値を表示(通常既定は'#? ')
* case文は、必要に応じてループと組み合わせてecho文で
質問や選択を促す一文と回答の選択肢を出力、その入力を受け取り
選択肢に応じた処理を行うことができ、各選択肢も|(縦棒)を使って
複数種類対応可能
* for/case/select文ではリストを in で受け取る(forは他の記述も可)
* for文でin listを省略する場合、コマンドライン引数の位置パラメータをとる
スペース区切りの引数個数分のリスト
* for文でin *とした場合、カレントディレクトリのファイルリストをとる
* 他の多くのスクリプトや言語同様のforカウンタは(())を伴って記述
* while/until/forで条件式や入力が省略される場合
** スクリプト実行または関数コール時の引数(による入力)
** 条件式の例/書式サンプルのinput (のような入力)
のいずれかが必要
* while文で < input のようにリダイレクトでファイルを読み込む場合
一般にはreadコマンドで行を読み込み変数(例: line )に格納後、
$を付加して $line のようにし、参照・利用
* input はファイルの他、バッククォートで括ったコマンドも可
例えばループでlsコマンドを渡せば走査終了時点でループも終了
shellが普通にUNIX/Linuxコマンドを処理することから不思議はない
* while/until/for/select文ではdo~doneと組み合わせる(ことも可)
do...doneは { ... ; } と記述することも可({ }内の行末尾には要セミコロン)
但し、 { ... } と記述する場合 < input というリダイレクトの書式は不可
* bashではコマンドの区切りを改行またはセミコロンで表すので
while/until/for/select文でdoとdoneの前にセミコロンを入れると
一行で記述することができる
例) while condition ; do command ; done
が、これを { ; } と置き換えると外側にはセミコロンが不要となり
例) while condition { command ; }
のように記述することもできる
(while/untilと read line 等の間はセミコロン不要)
このbashの性質を利用するとif...elif...else...fi文も
例) if condition ; then command ; fi
のように1行で記述することも可
その場合、 condition の後にもセミコロンを付加する必要がある
ちなみにif/while/case文のサンプルはこちら。