case文
case文は「文字列」を「パターン」と比較して分岐させる構文です。
基本的な構文は以下です。
case [文字列] in
[パターン1])
行いたい処理
・
・
;;
[パターン2])
行いたい処理
・
・
;;
[指定したパターン以外])
行いたい処理
・
・
;;
esac
基本事項
具体的な流れはcase直後にある「文字列」が上から「パターン1」→「パターン2」と順に比較していき、一致したパターンがあった段階でそのパターン直後にある「行いたい処理」を実行しcase文を抜けます。
なので「文字列」が複数の「パターン」に一致する場合があっても、一番最初に一致したパターン処理を行ってcase文が終了する事に注意が必要です。
パターンを「|」(パイプ)で区切ってor条件の記述をすることも可能。
;;の意味
「行いたい処理」の最後にある「;;」は、for文やwhile文のbreakに相当するものと思えばいいですね。
「行いたい処理」は「;;」で終了する必要があるが、最後の「行いたい処理」は「;;」を省略する事ができます。(必ずcase文が終わるしね)
breakに相当すると考えればよいとはいえ、「;;」を省略する事でC言語のように、case文を抜けずに次以降のパターンも処理を継続して行う事はできないです。
文字列
シェル変数を使ったり、コマンド置換「バッククォート」を使う事ができます。
パターン
パターンの記載にはパス名展開の特殊文字が使えるので、パターンの最後に「*)」と記載する事で全てのパターンに一致しなかった場合という意味になり、想定外の文字列があった場合に明示的にログ出力させたりすることができます。
ただし、通常のパス名展開特殊文字では先頭の「.」やパス名区切りの「/」はマッチングしないですが、case文の「パターン」として使用する場合は、パス名展開の特殊文字とはいえ「.」や「/」を特別扱いしてせず通常の文字と同様に扱えます。
終了ステータス
パターンが一致して実行された「行いたい処理」の最後のコマンドが終了ステータスになります。
ただしどのパターンにも一致しなかった場合は終了ステータスが0となります。
具体例
ログインしている所属グループによって処理を分けてみると以下のようになります。
case `id -gn` in
root)
echo '管理者グループです。'
;;
developer)
echo ’開発グループです。’
;;
examinator)
echo '試験グループです。'
;;
guest|other)
echo ’ゲスト・その他グループです。’
*)
echo 'PJ外グループです。'
;;
esac