シェルの制御文(繰り返し処理)の for と while についてです。
for文について
基本構文
for文の基本的な構文は次のようになります。
for 変数 in リスト; do 処理文 done
for文の使い方
基本構文にある変数に、指定したリストの値が順番に1個ずつ代入されていき、全て読み込んだらfor文も終了します。リストにはスペース(タブ)区切りの文字列、又は、配列が使用できます。
for var in a b c; do echo $var done # 実行結果 a b c
配列の場合は次の通りです。配列の繰り返しに関しては注意事項もあるので シェルの配列について も参照してください。
arr=("a" "b" "c") for var in "${arr[@]}"; do echo $var done # 実行結果 a b c
応用編
ls
コマンドで表示されるファイル全てに対して繰り返し処理を実行したい場合があります。しかし、そのままls
コマンドを実行するようにしてしまうと、空白が含まれたファイル名の時に意図しない挙動となってしまいます。
for file in `ls /home/test/`; do echo "${file}" done # 実行結果 hoge.txt fu # ファイル名に空白が入ってると分割される ga.txt bar.txt
このような場合は glob(グロブ)を使用するようにしましょう。
for file in /home/test/*; do echo "${file}" done # 実行結果 /home/test/hoge.txt /home/test/fu ga.txt /home/test/bar.txt
while文について
基本構文
while文の基本的な構文は次のようになります。
while command-list; do 処理文 done
while文の使い方
if文と同様にcommand-listに書かれたコマンドの、一番最後の終了コードが0の場合、doからdoneで囲まれた処理を実行します。これを終了コードが0でなくなるまで処理を繰り返し実行していきます。最初から終了コードが0でなかった場合は一回も処理が実行されません。
i=1 while [ $i -lt 5 ]; do echo $i i=`expr $i + 1` done
無限ループを作る
while文は条件の終了コードが0の間は繰り返し処理をするため、ヌルコマンド:
で無限ループの状態を作り出すことができます。ヌルコマンドは「何も処理をせず、0を終了コードとして返す」コマンドです。ただし、これをするからには break、
return、exitといったコマンドでループを抜ける手段は用意しましょう。
while : do .... break done
breakとcontinueについて
forやwhileのループから抜ける時にはbreak
コマンドを使用します。デフォルトでは1つのループを抜けますが、ネストしている時など、複数のループをまとめて抜け出したい時には引数を指定できます。
for hoge in "${arr[@]}"; do for fuga in "${arg[@]}"; do ... break 2 # 外のループも抜ける done done
ループから抜けないで次の繰り返しに移行したい場合はcontinue
コマンドを使用します。こちらもbreak
と同様にネストしている時は何番目のループの繰り返しに戻るか引数を指定することができます。
for hoge in "${arr[@]}"; do for fuga in "${arg[@]}"; do ... continue 2 # 外のループまで戻って次の繰り返しに移る done done
参考書籍
ソフトバンククリエイティブ
売り上げランキング: 95,987