server-memo.net

【シェルスクリプト】(繰り返し)while文

      2017/09/30

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.

 - シェルスクリプト