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.
|