SSブログ

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

 forループ構文には、前アーティクルに示したような書式の他にもう一つ形式がある。それは、C言語をはじめとする一般的な言語で当然のように備わっている書式である。
 ただし、シェルスクリプトである都合上、書き方が微妙に違うのでそこだけ要注意。

 for ((評価式1 ; 評価式2 ; 評価式3 ))
do
    繰り返し処理
 done

 評価式1、評価式2、評価式3   では判りづらいと思うので、まずはサンプルを見てもらおう。
#!/bin/sh

for (( I=0 ; I<10 ; I++ ))
do
    echo $I
done


 上記の処理を実行するとこうなる。
[root@mon002 tmp]# for (( I=0 ; I<10 ; I++ ))
> do
> echo $I
> done
0
1
2
3
4
5
6
7
8
9


 変数Iの内容が0から9まで変化していることがわかるだろうか。

 それでは、解説する。

 「((」と「))」とで囲まれた部分にある3つの「評価式」は、比較的C/C++的な記述方法が使える。exprコマンド的ではないことに注意する。

 まず、シェルスクリプトの実行がこのfor構文に差し掛かると、最初に「評価式1」が評価される。上記サンプルでは「I=0」となっている部分。その「評価式」が意味しているのは、「変数Iに0を代入」と、いう意味である。

 続いて、「評価式2」が評価される。上記サンプルでは「I<10」と、なっている部分。この「評価式」が意味しているのは、「変数Iが10未満であるか」と、いう意味である。
 なお、この「評価式2」の評価結果がの(条件式が成立しない)場合には、これ移行の処理や評価は行わず、for構文を終了してしまう。

 「評価式2」がの(条件式が成立した)場合には、次の「do」と「done」とで囲まれた「繰り返し処理」の部分が1回実行される。

 処理がdoneまでたどり着くと、こんどは「評価式3」が評価される。上記サンプルでは「I++」と、なっている部分。この「評価式」が意味しているのは「変数Iの内容をインクリメント(1加算)しなさい」という意味になる。

 整理すると

 ① 「評価式1」を評価する
 ② 「評価式2」を評価する
    真? → ③へ
    偽? → for構文終了
 ③ 繰り返し処理部分を1回実行する
 ④ doneまで到着
 ⑤ 「評価式3」を評価する
 ⑥ 「②」まで戻る

 ということ。上記サンプルの場合だと…

 ① 変数Iに0を代入する
 ② 変数Iは10未満ですか?
    結果は「真」
 ③ echo $Iを実行する。変数Iは0なので、「echo 0」が実行される
 ④ doneまで到着
 ⑤ 変数Iの内容をインクリメント(1加算)する。今は変数Iの内容は0なので、1加算して1になる
 ↓
 ② 変数Iは10未満ですか?
    結果は「真」
 ③ echo $Iを実行する。変数Iは1なので、「echo 1」が実行される
 ④ doneまで到着
 ⑤ 変数Iの内容をインクリメント(1加算)する。今は変数Iの内容は1なので、1加算して2になる
 ↓
 ② 変数Iは10未満ですか?
    結果は「真」
 :
 :(省略)
 :
 ③ echo $Iを実行する。変数Iは9なので、「echo 9」が実行される
 ④ doneまで到着
 ⑤ 変数Iの内容をインクリメント(1加算)する。今は変数Iの内容は9なので、1加算して10になる
 ↓
 ② 変数Iは10未満ですか?
    結果は「偽」なので、for構文を終了する

 ということが実行されている。

 なお、このfor構文の場合、変数を繰り返し処理の中で用いてもいいし、用いずに単に「X回繰り返す」という目的でだけ用いられることもある。上記サンプルでは思いっきり変数の中身を表示しているが、
#!/bin/sh

echo "so"
for (( I=0 ; I<6 ; I++ ))
do
    echo "Shining Shiner Shinyest"
    echo "Girls be ambitious & shine"
    echo ""
done

 とかいう感じで、上記サンプルの場合は変数Iには全く触れずにechoコマンドだけを6回繰り返している。

 ちなみに、2つのサンプルで例示しているfor構文。変数は何でも構わないことは言うまでも無いが、2つのサンプルで示している書き方は多用される基本形なので丸暗記してしまうことをお勧めする。
 なお、1個目のサンプルでは10回の繰り返しを実行するのに「0~9」の10回としているが、「1~10」で10回繰り返したい場合は、「for (( I=1 ; I<=10 ; I++ ))」とする。


 では、もう一つサンプルとして、「掛け算九九」の答えを表示するサンプルを示す。
 変数Iと変数Jとを用いてfor構文を入れ子にしている。
#!/bin/sh

for (( I=1 ; I<=9 ; I++ ))
do
        for (( J=1 ; J<=9 ; J++ ))
        do
                KOTAE=`expr $I \* $J`
                printf " %2d " $KOTAE
        done
        echo ""
done

 このシェルスクリプトを実行すると…
[root@test791 tmp]# ./kuku.sh
  1   2   3   4   5   6   7   8   9
  2   4   6   8  10  12  14  16  18
  3   6   9  12  15  18  21  24  27
  4   8  12  16  20  24  28  32  36
  5  10  15  20  25  30  35  40  45
  6  12  18  24  30  36  42  48  54
  7  14  21  28  35  42  49  56  63
  8  16  24  32  40  48  56  64  72
  9  18  27  36  45  54  63  72  81

 こんな具合になる。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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