SSブログ

サーバ管理者のためのプログラミング入門(シェルプログラミング基礎12~ループ処理その3) [サーバ管理者のプログラミング]

 for構文の次にうつる。

 今度はwhile構文とuntil構文。この二つの構文は基本的な動作は同じで、ちょっとだけ違う振る舞いをする。

while コマンド
do
    繰り返し処理
done

until コマンド
do
    繰り返し処理
done

 この2つの構文は、
 ① 「コマンド」を実行・評価する
 ② 繰り返し処理を1回実行する
 ③ 「①」に戻る

 という動作は一緒。ただし、『① 「コマンド」を実行・評価する』という、「評価」の部分で挙動が異なる。

 つまり、
    while構文の場合  コマンドがなら繰り返し処理を実行
    until構文の場合  コマンドがなら繰り返し処理を実行
 ということに。

 それでは、簡単なサンプルから。
#!/bin/sh

HENSU=$RANDOM

while test $HENSU -lt 30000
do
        echo $HENSU
        HENSU=$RANDOM
done

echo "LAST "$HENSU


 以前、ちょっと登場した変数RANDOMから、乱数を取り出しているが、その取り出した乱数が30000未満だった場合に、処理が繰り返されている。
 変数RANDOMの内容を変数HENSUに取り出しているのは、参照するたびに値が変わってしまうため。(これも以前のサンプルで説明している。)

 実行するとこんな感じになる。(実行するたびに結果は異なる)
[root@test791 tmp]# ./sample.sh
20737
14570
27332
8550
5638
3829
LAST 30753

 一番最後の行の「LAST 30753」を表示しているのはwhile構文の下(外)にあるechoコマンドだ。この結果は「30000未満」という条件を満たしていないので、while構文の中身は全く実行されない。よって、最後のechoが無ければこの表示がされないことに注意してもらいたい。

 なお、while構文は人間が手動で処理を止めるまで、延々と繰り返し処理をしたい場合にも使われる。(これを「永久ループ」とか「無限ループ」とも)
 例えば、30秒おきにnetstat -iの情報を表示させて、ネットワークインタフェースの状態を確認したい時とか、
while :
do
    netstat -i
    sleep 30
done

 こんな具合に。「while」に続けて「:」と記述しているが、これは「常に真」を意味する。whileの評価式が常に真ということなので、永遠に処理を繰り返す…ということになる。止めたいときはCtrl+Cとかkillするとかしてもらいたい。

 untilを使ったサンプル。
 とあるサーバ(停止中)に対してこれから電源を投入して起動するが、起動するまで待つ…という場合。pingに反応したら「起動した」と判断している。(手抜き)なお、チェックは30秒ごとに試みている
until ping -c 1 SERVER > /dev/null 2>&1
do
    sleep 30
done


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。