シェルスクリプト while




シェルスクリプト中の処理の繰り返しには 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 条件で結ぶ