シェル・スクリプト・リファンレス
コマンド集(機能別) | コマンド集(アルファベット順) | コマンド逆引き大全 | シェル・スクリプト・リファンレス

 文字列に一致する条件で分岐する「case」

 caseは与えられた文字列と一致するパターンの処理を行う分岐制御文だ。caseは以下のように記述する。


case 文字列 in
    条件1)    処理1 ;;
    条件2)    処理2 ;;
    条件3)    処理3 ;;
           :
esac

 caseの後に書かれた文字列と各条件を比較し,マッチしたものの処理を行う。たとえば文字列が「Fukuda」で条件3が「Fukuda」であった場合は,処理3を処理する。また,条件は上から順に行われていくため,もし,マッチする条件が複数存在した場合でも,先に評価された条件が優先される。また,各条件の処理の最後には「;;」を付ける。

 たとえば,以下のようなシェル・スクリプト「name.sh」があったとする。


#!/bin/sh

case $USER in
    root)     echo "Hello Adoministrator." ;;
    fukuda)   echo "Ciao, my master." ;;
    tejima)   echo "How are you, Mr.Tejima?" ;;
esac

 このスクリプトではログインしているユーザー名を調べ,それぞれのユーザーごとに表示するメッセージを分けている。例えば,fukudaユーザーでログインして,このスクリプトを実行すると,


$ ./name.sh 
Ciao, my master.

のように表示される。


 条件の記述方法

 条件にはアルファベットや数字,記号などを記述できる。また,ワイルド・カードのような任意の文字を表す記号も利用できる。


記号 意味
? 任意の1文字
* 0文字以上の任意の文字列
[...] [...]に含まれる1文字
[!...] [!...]に含まれない任意の1文字
パターン1|パターン2 パターン1またはパターン2

 たとえば,以下のようなシェル・スクリプト「luncher.sh」があったとする。


#!/bin/sh

case $1 in
    *.txt)         emacs $1 ;;
    *.jpg|*.jpeg)  gimp $1 ;;
    *.mp3)         xmms $1 ;;
esac

 このスクリプトはファイルの拡張子を評価し,もしtxtであったらテキスト・エディタのemacs,jpgまたはjpegであったらgimpを実行する。


 条件に一致しないときの処理

 caseで記述されている条件すべてにマッチしなかったときに,特定の処理を行いたい場合は,最後の条件として「*)」を記述する。


case 文字列 in
    条件1)    処理1 ;;
    条件2)    処理2 ;;
    条件3)    処理3 ;;
           :
    *)        条件にマッチしなかったときの処理 ;;
esac

 「*」は任意の文字列なので,条件1,2・・・でマッチしなかったときに最終的に実行されるようになる。

 たとえば,以下のようなシェル・スクリプト「luncher.sh」があったとする。


#!/bin/sh

case $1 in
    *.txt)         emacs $1 ;;
    *.jpg|*.jpeg)  gimp $1 ;;
    *.mp3)         xmms $1 ;;
    *)             echo "I don't know this file." ;;
esac

 こうすると,知らない拡張子のファイルを指定した場合は,メッセージを表示する。


$ ./luncher.sh document.doc 
I don't know this file.