while文について
while文は指定した条件が真である限り処理を繰り返します。
while 条件 do 処理 done
条件の後に「;」をつけることで、下記のような書き方もできます。
while 条件; do 処理 done
スクリプト例
変数「i」が1~6より小さい間(1から5まで)だけ、変数「i」に代入された値を「echo」で表示した後に「expr」コマンドを使用して、変数「i」に1を足していくという内容です。
#!/bin/bash i=1 while [ $i -lt 6 ] do echo "$i" i=`expr $i + 1` done
上記スクリプトの実行結果は下記のようになります。
$ sh ./while1.sh 1 2 3 4 5
bash限定ですが、exprは遅いので(( ))を使用した算術式を使用したほうが早いそうです。
参考サイト http://qiita.com/d_nishiyama85/items/a117d59a663cfcdea5e4
#!/bin/bash i=1 while ((i < 6)) do echo $i i=$(( i + 1 )) done
条件の指定
条件の指定には[](テスト)を使用する場合が多いですが、それ以外も条件として指定することが出来ます。
ファイルから読み込む
ファイルの内容を読み込んで一行ずつ表示させてみます。
今回は「list.txt」というファイルを用意しました。
$ cat list.txt abc def ghi jkl mno pqr xyz
「read」コマンドを使ってファイルの中身を読み込ませて中身を1行ずつ表示させてみます。
#!/bin/bash while read line do echo "$line" done < ./list.txt
上記シェルスクリプトを実行すると、「list.txt」ファイルの中身を一行ずつ読み込んで、その内容が表示されます。
$ sh while3.sh abc def ghi jkl mno pqr xyz
無限ループ
条件にヌルコマンド「:」(コロン)を指定すると無限ループになります。
while : do 処理 done
ヌルコマンド「:」は何もせずに終了コード0(真)を返すので、条件が真となり続けるため無限ループになります。
無限ループを終了させるには「Ctrl」+「c」で強制的に終了させるか処理部分で「if」「case」文など条件分岐で「break」「return」「exit」といったコマンドを実行させます。
無限ループスクリプト例
無限ループに「case」文を組み込んでスクリプトを作成してみます。
「Rpeat? (y/n) :」の問いかけに「y」キーを入力すると、「Repeat!」と表示して処理が繰り返されて、
「n」キーを入力すると、「Rpeat end.」と表示して処理が終了します。
「y」「n」以外のキーを入力すると、「Push y or n key.」と表示して、「y」と「n」キーどちらかを入力するように促すメッセージを表示し処理を繰り返します。
#!/bin/bash while : do read -p "Repat? (y/n) :" key case "$key" in y) echo "Repeat!";; n) echo "Repeat end." break ;; *) echo "Push y or n key.";; esac done
実行結果は下記のとおりとなります。
Repat? (y/n) :q 「y」「n」以外を入力 Push y or n key. Repat? (y/n) :y 「y」を入力 Repeat! Repat? (y/n) :n 「n」を入力 Repeat end.
コメント