Bashにおける制御構文の中でもループを実現する構文の説明です。
コマンドなどを指定回数実行するといった場合にはfor文を使うことができます。 for文の基本の形は以下のようになります。
for i in 変数1 変数2 変数3…
do
実行文
done
変数X(変数1~)の数だけ実行文が繰り返されます。この時、変数iには実行毎に変数Xが代入されます。
for i in 1 2 3 4 5
do
echo $i
done
このようなループによって、以下の出力を得ることができます。
1
2
3
4
5
条件が満たされている限り(真である間)実行文を繰り返すにはwhileを使用します。 whileの基本的な構文は以下の通りです。
while 条件式
do
実行文
done
条件式の内容が真(0)である限り、実行文が繰り返され、条件式の内容が偽(0以外)になるとループが停止します。
条件式では評価関数であるtestやその簡易表記である[ ]などが利用されます。 以下ではSTOP_CONDITIONという変数が0より大きい限りechoで表示をする例を示しています。
STOP_CONDITION=5
while [ $STOP_CONDITION -gt 0 ]
do
echo "STOP_CONDITION : "$STOP_CONDITION
STOP_CONDITION=$(( $STOP_CONDITION - 1 ))
sleep 1
done
この出力は以下のようになります。
STOP_CONDITION : 5
STOP_CONDITION : 4
STOP_CONDITION : 3
STOP_CONDITION : 2
STOP_CONDITION : 1
このようにwhileループは、適切に停止条件を設定して停止させる必要があります。逆に、停止条件が適切に設定されていない場合は無限ループに陥ります。 ここでは処理が分かりやすいようにsleepを入れましたが、実際にshellスクリプトを記述して十分デバッグが出来ていない時に念のためsleepを入れておくと、大暴走を防いだりできるので有効なテクニックでもあります。条件判定を誤ると簡単に無限ループにはまって、ほかのユーザに大迷惑をかけてしまうことがありますので注意してください。
なお、意図的に無限ループを作る場合もあります。
while true
do
echo "loop"
sleep 1
done
このようなループを記述することで、1秒おきに"loop"という出力を永遠に繰り返します。
while文の逆でuntilは条件式が満たされない限り実行文を繰り返します。 until文の基本的な書式は以下のようになります。
while 条件式
do
実行文
done
条件式の内容が偽(0以外)である限り、実行文が繰り返され、条件式の内容が真(0)になるとループが停止します。
STOP_CONDITION=5
until [ $STOP_CONDITION -lt 0 ]
do
echo "STOP_CONDITION : "$STOP_CONDITION
STOP_CONDITION=$(( $STOP_CONDITION - 1 ))
sleep 1
done
この時の出力は以下のようになります。
STOP_CONDITION : 5
STOP_CONDITION : 4
STOP_CONDITION : 3
STOP_CONDITION : 2
STOP_CONDITION : 1
STOP_CONDITION : 0