処理を分岐させる制御構文にif文がありますが、もうひとつcase文もあります。値による場合分けをif文より見やすく記述することができるのが特徴です。
#!/bin/bash read input1 case $input1 in yes ) echo "OK!" ;; no ) echo "NG!" ;; * ) echo "Unknown" ;; esac
- case文の基本形
-
case 文字列 in
パターン1)
コマンド1
;;
パターン2)
コマンド2
;;
パターン3)
コマンド3
;;
esac
上記ではパターン3までのなっていますが、パターンは何個でも記述できます。
case文は、文字列が一致するパターンによって処理を分岐させます。パターンとコマンドとの組み合わせが複数並ぶ形で、上から順にパターンと文字列とを比較して、一致したところのコマンドを実行します。セミコロン2つ(;;)がコマンドを終わりを指示します。
上記サンプルでは、入力値を変数input1に格納し、その値がyesの場合はechoコマンドでOK!と出力し、noの場合はNG!と出力します。また、yes、noのどちらでもない場合は、3番目のパターンで一致し、Unknownと出力します。3番目のパターンで指定しているアスタリスク(*)は「0文字以上の任意の文字列」を意味します。つまり、すべての文字列と一致するため、結果として「上のどのパターンにも当てはまらない場合」という意味になります。
このアスタリスク(*)は正規表現のひとつです。
正規表現には以下のようなものがあります。
表現 | 説明 |
---|---|
* | 0文字以上の任意の文字列 |
? | 任意の1文字 |
[abc] | a、b、cのどれか1文字 |
[a-z] | aからzのどれか(つまり任意の英小文字) |
[0-9] | 0から9のどれか(つまり任意の数字) |
[!0-9] | 0から9以外の文字(つまり数字以外) |
case文のパターンでは、この正規表現を使い、文字列をあいまいに指定することができます。例えば、「1文字目がアルファベット、2文字目が数字、3文字目からは任意で、最後の文字列が英小文字」というパターンは、[a-zA-Z][0-9]*[a-z]となります。
正規表現を使った例
read input1 case $input1 in y* ) echo "OK!" ;; no|No|NO ) echo "NG!" ;; [a-zA-Z]* ) echo "Alphabet" ;; [0-9]* ) echo "Numeric" ;; esac
上記サンプルのパターンの意味をひとつずつ考えてみましょう。
y* | yで始まる任意の文字列 |
---|---|
no|No|NO | no、No、NOのいずれか |
[a-zA-Z]* | aからz、AからZのいずれかで始まる任意の文字列 |
[0-9]* | 0から9までのいずれかで始まる任意の文字列 |
[a-zA-Z]という書き方を[a-Z]とは書けませんので注意が必要です。大文字と小文字は連続した文字ではないためです。正規表現の書き方についてはたくさん書いて慣れていくしかありません。