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 正常終了
$
↑先頭へ
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」を抜けます。
↑先頭へ