シェルの繰り返し処理の使い方について (forとwhile)

スポンサーリンク

シェルの制御文(繰り返し処理)の 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

 Man page of GLOB

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

参考書籍

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
ブルース ブリン
ソフトバンククリエイティブ
売り上げランキング: 95,987