シェルスクリプト中の処理の繰り返しには while を用いる。
while では、ある条件が真の場合に do から done までの処理を実行し、
偽の場合に do 以下の処理は実行せずに done 以下の処理を実行する。
つまり、条件が常に真の場合には処理が終わることなくループすることになる。
一般的には、do から done の間で特定の値(例. カウント値)を変化させるようにしておいて、
その値を条件で真・偽判定する。
例では、与えられたファイルの内容を 1 行づつ読み込んで別ファイルに出力するために、
while を使って、ファイルの行数分処理を繰り返している。
まず変数 NUM に与えられたファイル (/tmp/input.txt) の行数を格納し、
while の do と done の中で変数 COUNT を 1 づつ増している。
while の条件式で変数 COUNT と変数 NUM を比較して、
変数 NUM より小さい場合に do と done の間の処理を実行する。
つまり、ファイルの行数分だけ do と done の間の処理を実行することになる。
NUM=`wc -l /tmp/input.txt | cut -d " " -f 1` COUNT=0 while [ $COUNT -lt $NUM ] ; do COUNT=`expr $COUNT + 1` DATA=`head -$COUNT /tmp/input.txt | tail -n 1` echo $DATA > /tmp/${COUNT}.txt done
これを実行すると、
/tmp/input.txt が次のような場合、
以下のような /tmp/1.txt, /tmp/2.txt, /tmp/3.txt が作成される。
/tmp/input.txt
1111111111 2222222222 3333333333
/tmp/1.txt
1111111111
/tmp/2.txt
2222222222
/tmp/3.txt
3333333333
使用できる条件式は次の通り。
○文字列条件式 文字列1 = 文字列2 文字列1 と文字列2 が一致なら真 文字列1 != 文字列2 文字列1 と文字列2 が一致しないなら真 -n 文字列1 文字列1 が空 (null) でなければ真 -z 文字列1 文字列1 が空 (null) であれば真
○数式条件式 整数1 -eq 整数2 整数1 と整数2 が等しければ真 (整数1 == 整数2) 整数1 -ge 整数2 整数1 が整数2 以上であれば真 (整数1 >= 整数2) 整数1 -gt 整数2 整数1 が整数2 よりも大きければ真 (整数1 > 整数2) 整数1 -le 整数2 整数1 が整数2 以下であれば真 (整数1 <= 整数2) 整数1 -lt 整数2 整数1 が整数2 よりも小さければ真 (整数1 < 整数2) 整数1 -ne 整数2 整数1 と整数2 が等しくなければ真 (整数1 != 整数2)
○ファイル条件式 -d ファイル1 ファイル1 がディレクトリであれば真 -f ファイル1 ファイル1 が通常ファイルであれば真 -r ファイル1 ファイル1 がスクリプト実行ユーザで読み出し可能であれば真 -s ファイル1 ファイル1 が空ファイルでなければ真 -w ファイル1 ファイル1 がスクリプト実行ユーザで書き込み可能であれば真 -x ファイル1 ファイル1 がスクリプト実行ユーザで実行可能であれば真
○論理演算子 ! 直後に続く条件式の結果を否定する -a 2 つの条件式を AND 条件で結ぶ -o 2 つの条件式を OR 条件で結ぶ