制御構文 FOR / SELECT
システム管理者 Unixパワーユーザのためのコマンドリファレンス

[ Linux / Unix リファレンスガイド ] ⇒ [ シェルスクリプト ] ⇒ [ 制御構文 FOR / SELECT ]


 
FOR

変数に引数を代入し処理を実行、処理が終わると次の引数を変数に代入し処理を再実行。最後の引数まで処理が実行される。ループを途中で抜ける場合は break を用いても良い。詳しくは制御構造 break を参照。

■基本的な書式
for 変数 in 引数1 引数2 ・・・ 引数n
do
     処理
done


■サンプルスクリプト
スペースで区切られた生年月日(1980年2月13日 4時5分) をCSV(カンマで区切られた値)に変換するスクリプト。このサンプルだと一つの値しか処理できませんが、これを参考にカスタマイズすれば大量のデータを一括でCSVに変換するスクリプトを作れると思います。

※行最後にあるカンマは不要ですが、サンプルのため削除する処理は入れていません。


#!/bin/sh
for cnt in 1980 2 13 4 5
do
    printf "${cnt},"
done

■出力結果
1980,2,13,4,5,


SELECT

ユーザーに変数を選択させ、処理を実行し続ける。延々と「選択と処理」が継続されるためBREAKを用いてループを抜ける。WHILE・CASE・READを組み合わせても同様の処理が可能。

■基本的な書式
select 変数 in 引数1 引数2 ・・・ 引数n
do
     処理
done



■ifとbreakを組み合わせた応用例の書式

select 変数 in 引数1 引数2 引数3
do
     if [ 条件1 ]
     then
          処理1
     elif [ 条件2 ]
     then
          処理2
     elif [ 条件3 ]
     then
          処理3
          break
done
処理4



※条件1の初期は処理1が、条件2の時は処理2が、条件3の時はBREAKでループ終了する。1か2を選んだ場合は先頭に戻りループが再開される。

条件3の場合、breakによってselectのループが終了し、終了処理4に入る。終了処理4に相当するものがなく処理3でプログラムを終了させたい場合は、break の代わりに exit としておけば良い。breakを使った場合は、select から抜けるだけなので引き続き処理4の部分を追記していくことが可能。



■サンプルスクリプト
変数actの内容を検査し、exitでなければ du コマンドで対象ディレクトリの合計ファイルサイズを確認。exitの場合はスクリプトをbreakでループを抜けて、終了メッセージを表示する。

#!/bin/sh
select act in var opt home exit
do
    if [ ${act} = exit ]
    then
        break
    else
        du -h --max-depth=0 /${act}
    fi
done
echo "exit"

■実行結果
[root@localhost ]# ./select.sh
1) var
2) opt
3) home
4) exit

#? 1
66M /var

#? 2
4.0K /opt

#?
1) var
2) opt
3) home
4) exit

#? 4
exit

[root@localhost ]#