シェルスクリプトでの条件分岐ではifがよく使われる。
しかし条件分岐の方法はifだけではなく、caseも使いやすい場合がある。
このページではシェルスクリプトでのcaseの使い方についてお伝えしよう。
条件分岐をさせるcase
caseとは?
caseとは条件にマッチしたケースで処理を決めていくパターンだ。
例えば、変数の値が「appleであればリンゴを表示」「orangeであればオレンジを表示」「grapeであればブドウを表示」というプログラムがあったとき、caseを使うと便利だ。
ifでももちろん表現できるが、caseの方が使いやすい。
caseはC言語のswitchに相当する。if文とくらべると複雑な条件はたてるのには向いていない。caseでできることはifでも可能なので、現にPythonなどではcaseにあたる文法は存在しない。
しかし一つの変数で多くの分岐選択肢を設定できるので、便利なことは間違いない。文法も簡素なので可読性も高い、用途に応じて使い分けよう。
caseの書式について
caseの書き方は次のようになる。
case 変数 in
マッチパターン1 ) 処理1 ;;
マッチパターン2 ) 処理2 ;;
マッチパターン3 ) 処理3 ;;
マッチパターンN ) 処理N ;;
esac
上から順に処理され、どのパターンにもマッチしなかった場合はなにも処理されない。最後に「;;」とふたつセミコロンをつけることに気をつけよう。
サンプルプログラム
vi case-ex1.sh
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/bash #変数作成と値取得 read -p: VAR #case文、簡素な分岐が可能 case "$VAR" in "a" ) echo ”処理1です” ;; "b" ) echo “処理2です” ;; "c" ) echo “処理3です” ;; "d" ) echo “処理4です” ;; esac |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ ./case-ex1.sh :a 処理1です $ ./case-ex1.sh :b 処理2です $ ./case-ex1.sh :c 処理3です $ ./case-ex1.sh :d 処理4です $ ./case-ex1.sh :e |
パターンに変数やワイルドカード(* | []など)を指定する
パターンマッチングなのでワイルドカードなども利用可能だ。
vi case-ex2.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/bash #変数を使用したパターン PTN=abc #分岐用の値を収める変数の値を取得 read -p : VAR #case文 アスタリスクやOR条件、変数などをパターンとして設定できる。 case "$VAR" in ans* ) echo "VARはansで始まる文字列" ;; [A-Z]* ) echo "VARは大文字A~Zで始まる文字列" ;; "yes" | "YES" ) echo "VARはyesもしくはYES" ;; "$PTN" ) echo "マッチパターンは変数であっても問題ない" ;; * ) echo "全てのパターンにマッチ、最後にもってくることで上記以外の場合を想定できる" ;; esac |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ./case-ex2.sh :ans VARはansで始まる文字列 $ ./case-ex2.sh :Ans VARは大文字A~Zで始まる文字列 $ ./case-ex2.sh :yes VARはyesもしくはYES $ ./case-ex2.sh :abc マッチパターンは変数であっても問題ない $ ./case-ex2.sh :aaaaaaaa 全てのパターンにマッチ、最後にもってくることで上記以外の場合を想定できる |
マッチパターンにアスタリスクなどを使うことも可能であり、変数も指定できるほか 「|」をつかうことで「or」の処理をさせることができる。
まとめ
このページではシェルスクリプトでのcaseの使い方についてお伝えしてきた。
可読性が高く便利なことも多いため、ifと並行して使えるようになっておこう。