気の向くままに辿るIT/ICT/IoT
bash

bash フロー制御構造

ホーム前へ次へ
フロー制御ってなに?

bash フロー制御構造

フロー制御構造

 UNIX/Linuxシェルの1つであるbashのフロー制御構文には、if...elif...else文、while文とwhile文と条件が対になるuntil文、for文、case文、select文があり、その書式は下記の通りです。

bashのループと条件分岐の書式

 bashのフロー制御構文は他のスクリプトやプログラム言語よりも柔軟な複数の記述方法があったり、bash固有の記述方法もあったりします。

bashフロー制御条件式の例書式サンプル
if...elif...else...fiif  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...donefor((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...doneselect list in var1 var2 ...varN   select list in var1 var2
do
   command
done
case...esaccase var in case var in 
 pattern1 )
   command
   ;;
 pattern2 )
   command
   ;;
 patternN )
   command
   ;;
esac

 * bashでは変数(例ではiやvarlist等々)使用時は、
    代入時に$は付加せず参照時に変数の先頭に$を付加

 * 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文のサンプルはこちら。

LINK

ホーム前へ次へ