シェルスクリプト入門 [制御構文]

UNIX入門 > シェルスクリプト入門 > 制御構文
if
case
while
for
until

制御構文

if

条件によって処理を分岐させたい場合は、if文を使用します。
シェルスクリプトのif文は下記のような構文になります。

if [ 条件1 ]
then
  処理1
elif [ 条件2 ]
then
  処理2
else
  処理3
fi

if、スペース、[ 条件 ] という文法となりますが、条件の前後にはスペースを入れないと、エラーとなりますので注意が必要です。「 if [ 条件 ] 」という書き方を「 if test 条件 」と書くこともできます。elif, else は省略することも可能です。また、条件が偽の場合に処理を行いたい場合は、「! 条件」と記述します。下記は、簡単なif文のサンプルです。
test.sh

#!/bin/sh
pwd
ret=$?
if test ${ret} -eq 0
then
  echo "pwd 正常終了"
else
  echo "pwd 異常終了"
fi

上記サンプルスクリプトの2〜3行目は「pwd」コマンドを実行して、終了コード(戻り値)を変数「ret」に格納しています。4行目以降は、変数「ret」が「0」なら正常終了と表示し、「0以外」なら異常終了と表示します。それでは実際に上記スクリプト実行してみます。以下のような結果となります。

$ test.sh
/home/user
pwd 正常終了
$

↑先頭へ

case

変数の値によって複数の処理に分岐させたい場合は、case文を使用します。
case文は下記のような構文になります。

case 変数 in
   パターン1) 処理;;
   パターン2) 処理;;
   パターン3 | パターン4) 処理;;
   *) 処理;;
esac

;;」は「case文を抜ける」という意味です。「*)」は「いずれのパターンにもあてはまらない場合」という意味で、省略可能です。パターンを「 | 」で区切って論理和(or)をとることもできます。また、パターンには正規表現が使えます。正規表現についてはこちらを参照ください。

↑先頭へ

while

条件が真である間、処理を繰り返し実行したい場合は、while文(ループ処理)を使用します。処理を途中で中断してループを抜けたい場合は「break」、ループの先頭に戻りたい場合は「continue」を使用します。while文は下記のような構文になります。

while [ 条件 ]
do
  処理
done

以下はwhile文を使用したサンプルスクリプトです。
while_test.sh

#!/bin/sh
a=0
while [ $a -ne 10 ]
do
  a=`expr $a + 1`
  echo "${a} 回目の処理"
done

上記は、変数「a」を「echo」コマンドで表示する処理を10回繰り返します。
実行結果は以下のようになります。

$ while_test.sh
1 回目の処理
2 回目の処理
3 回目の処理
4 回目の処理
5 回目の処理
6 回目の処理
7 回目の処理
8 回目の処理
9 回目の処理
10 回目の処理
$

また、ファイルを1行毎に読み込んで処理させたい場合は、以下のような構文になります。

while read line
do
  処理(${line}を処理)
done < ファイル

line」は変数であり、指定したファイルを1行毎に読み込んで順次「line」に格納されます。ファイルの終端(EOF)まできたら「while」を抜けます。

↑先頭へ

for

与えられた引数の数だけ、処理を繰り返し実行したい場合は、for文(ループ処理)を使用します。処理を途中で中断してループを抜けたい場合は「break」、ループの先頭に戻りたい場合は「continue」を使用します。for文は下記のような構文になります。

for 変数 in 引数1 引数2 …
do
  処理
done

変数に与えられた引数を順次代入していき、引数がなくなり次第「for」を抜けます。
以下はfor文を使用したサンプルスクリプトです。
for_test.sh

#!/bin/sh
for arg in $@
do
  echo ${arg}
done

上記は、シェルに与えられた引数「$@」を変数「arg」に順次格納して、「echo」で表示します。それでは実際に上記スクリプトに引数を与えてみます。以下のような結果となります。

$ for_test.sh aa bb cc dd
aa
bb
cc
dd
$

↑先頭へ

until

条件が偽である間、処理を繰り返し実行したい場合は、until文(ループ処理)を使用します。処理を途中で中断してループを抜けたい場合は「break」、ループの先頭に戻りたい場合は「continue」を使用します。until文は下記のような構文になります。

until [ 条件 ]
do
  処理
done

until文の用途としては、あるコマンドが正常終了(終了コード=0)するまで、コマンドを繰り返し実行したい場合などに便利です。例として以下のような処理です。

#!/bin/sh
until コマンド
do
  sleep 5
done

コマンドが異常終了(終了コード!=0)した場合は、5秒間スリープして再実行を繰り返します。コマンドが正常終了(終了コード=0)したら、「until」を抜けます。

↑先頭へ