Shell Script [if,case,while,for]

Date : 2005-11-26
Author : Defolos

CONTENTS

(1.) 条件分岐[if,case]
- 条件分岐[if]
- 条件分岐[case]
- 条件判定
(2.) 繰り返し処理[while,for]
- 繰り返し処理[while]
- 繰り返し処理[for]

条件分岐[if,case]

● 条件分岐[if]

 プログラムには、必ずといってよいほど条件による分岐が必要です。プログラムのアルゴリズムを細分化していくと、順次・繰り返し・分岐の三つが最小単位となることからも、最も基本的なもののひとつだと思ってもらってよいでしょう。

[if構文]

if 条件1; then
    コマンド(条件1が真のときの処理)
    .....
elif 条件2; then
    コマンド(条件2が真のときの処理)
    .....
else
    コマンド(条件1,2が偽のとき)
  .....
fi

 例)入力した文字列が1以上なら「TRUE!」を、-1以下なら「FALSE!」を、0なら「NULL...」を返すスクリプト


#!/bin/sh

if [ $1 -gt 0 ]; then
  echo "TRUE!"

elif [ $1 -lt 0 ]; then
  echo "FALSE!"

else
  echo "NULL..."

fi

● 条件分岐[case]

 caseはifのように条件分岐を行います。caseで表現できることは、ifを使っても表現でき、その逆も成り立ちます。
 C言語のswitch文に似た働きを持ちますが、brake文の省略によるor機能を持たせることはできません。また、ワイルドカードも使用でき、"a*"とすればaから始まる文字列全てに一致します。

[caseの文法]

case 文字列 in
  パターン1)
    パターン1と文字列が等しいときの処理
    ;;
  パターン2 | パターン3)
    パターン2またはパターン3と文字列が等しいときの処理
    ;;
  *)
    上記パターンにあてはまらないときの処理
    ;;
esac

 例)引数によって文字列を表示するスクリプト


#!/bin/sh

case "$1" in
  --start)
    echo "[Start]"
    ;;
  --stop)
    echo "[Stop]"
    ;;
  --re*)
    echo "[Reload]"
    ;;
  *)
    echo "[Unknown]"
    ;;
esac

 sample10.shは、Red Hat Linuxなどの起動スクリプトで頻出するスクリプトです。

● 条件判定

 条件は[ ]で挟みます。[ ] の前後には、必ず半角スペースを空けてください。

[ファイル属性演算子]

[文字列関係]

[論理演算子]

[数字関係]

[文字比較演算子]


繰り返し処理[while,for]

● 繰り返し処理(while)

 一定条件の間の繰り返し処理にはwhileを使います。その後に書かれるコマンドが真を返すとき(返す限りにおいて)doとdoneの間に書かれたコマンド(列)を実行し続けます。

[whileの文法]

while 条件
do
      コマンド
done

 例)引数を表示するスクリプト


#!/bin/sh

while [ $# -gt 0 ]
do
      echo "> $1"
      shift
done

[実行結果:sample7.sh]

$ sh sample7.sh 1 2 3 4

> 1
> 2
> 3
> 4

● 繰り返し処理(for)

 whileとは違いは、リストの全ての要素をループす点にあります。リストとは1 2 3 4 ...のようにスペースで区切った文字、数字などのことです。

[forの文法]

for 変数名 in リスト
do
      処理
done

#!/bin/sh
for box in 1 2 3 4 5
do
      echo $box
done

[実行結果:sample8.sh]

$ sh sample8.sh

1
2
3
4
5

 しかし、シェルスクリプトでは数字や文字のリストは扱うことが少なく、*や*.htmなどのワイルドカードを使うことが多いようです。

 例).txtファイルを全て.htmファイルに変換してコピーするスクリプト


#!/bin/sh
for FILE in *.txt
do
      echo "copy: $FILE -< $FILE.htm"
  cp $FILE $FILE.htm
done

 また、リストには外部ファイルを指定することもできます。


#!/bin/sh
for box in `cat $1`
do
      echo "> $box"
done


■参考文献


go back to the TOP page of Glazheim Lykeion.