プログラムには、必ずといってよいほど条件による分岐が必要です。プログラムのアルゴリズムを細分化していくと、順次・繰り返し・分岐の三つが最小単位となることからも、最も基本的なもののひとつだと思ってもらってよいでしょう。
if 条件1; then コマンド(条件1が真のときの処理) ..... elif 条件2; then コマンド(条件2が真のときの処理) ..... else コマンド(条件1,2が偽のとき) ..... fi
例)入力した文字列が1以上なら「TRUE!」を、-1以下なら「FALSE!」を、0なら「NULL...」を返すスクリプト
#!/bin/sh
if [ $1 -gt 0 ]; then
echo "TRUE!"
elif [ $1 -lt 0 ]; then
echo "FALSE!"
else
echo "NULL..."
fi
caseはifのように条件分岐を行います。caseで表現できることは、ifを使っても表現でき、その逆も成り立ちます。
C言語のswitch文に似た働きを持ちますが、brake文の省略によるor機能を持たせることはできません。また、ワイルドカードも使用でき、"a*"とすればaから始まる文字列全てに一致します。
case 文字列 in パターン1) パターン1と文字列が等しいときの処理 ;; パターン2 | パターン3) パターン2またはパターン3と文字列が等しいときの処理 ;; *) 上記パターンにあてはまらないときの処理 ;; esac
例)引数によって文字列を表示するスクリプト
#!/bin/sh
case "$1" in
--start)
echo "[Start]"
;;
--stop)
echo "[Stop]"
;;
--re*)
echo "[Reload]"
;;
*)
echo "[Unknown]"
;;
esac
sample10.shは、Red Hat Linuxなどの起動スクリプトで頻出するスクリプトです。
条件は[ ]で挟みます。[ ] の前後には、必ず半角スペースを空けてください。
一定条件の間の繰り返し処理にはwhileを使います。その後に書かれるコマンドが真を返すとき(返す限りにおいて)doとdoneの間に書かれたコマンド(列)を実行し続けます。
while 条件 do コマンド done
例)引数を表示するスクリプト
#!/bin/sh
while [ $# -gt 0 ]
do
echo "> $1"
shift
done
$ sh sample7.sh 1 2 3 4 > 1 > 2 > 3 > 4
whileとは違いは、リストの全ての要素をループす点にあります。リストとは1 2 3 4 ...のようにスペースで区切った文字、数字などのことです。
for 変数名 in リスト do 処理 done
#!/bin/sh
for box in 1 2 3 4 5
do
echo $box
done
$ sh sample8.sh 1 2 3 4 5
しかし、シェルスクリプトでは数字や文字のリストは扱うことが少なく、*や*.htmなどのワイルドカードを使うことが多いようです。
例).txtファイルを全て.htmファイルに変換してコピーするスクリプト
#!/bin/sh
for FILE in *.txt
do
echo "copy: $FILE -< $FILE.htm"
cp $FILE $FILE.htm
done
また、リストには外部ファイルを指定することもできます。
#!/bin/sh
for box in `cat $1`
do
echo "> $box"
done