Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

case

『case』文は変数やコマンドの出力をパターンと照合して処理を分岐します。複数の値への多分岐をシンプルに書けるため、コマンドライン引数の処理やメニュー選択などでよく使います。

構文
case 変数 in
    パターン1)
        処理1
        ;;
    パターン2 | パターン3)
        処理2
        ;;
    *)
        デフォルト処理
        ;;
esac
パターン一覧
パターン概要
word)完全一致です。word と等しいときに実行されます。
pat1 | pat2)OR 条件です。どちらかに一致すれば実行されます。
*.txt)ワイルドカードパターンです。.txt で終わる文字列に一致します。
[aeiou])文字クラスです。a・e・i・o・u のいずれかに一致します。
?)任意の1文字に一致します。
*)すべてに一致するデフォルトパターンです。最後に置きます。
;;パターンブロックの終端です(次のパターンに落ちません)。
;&次のパターンブロックにも続けて実行します(Bash 4以降)。
;;&次のパターンを評価して一致すれば実行します(Bash 4以降)。
サンプルコード

コマンドライン引数に応じて処理を分岐します。『|』でOR条件をまとめられます。

#!/bin/bash
action=$1

case "$action" in
    start)
        echo "サービスを起動します"
        ;;
    stop)
        echo "サービスを停止します"
        ;;
    restart | reload)
        echo "サービスを再起動します"
        ;;
    status)
        echo "サービスの状態を確認します"
        ;;
    *)
        echo "使い方: $0 {start|stop|restart|reload|status}"
        exit 1
        ;;
esac
# ./script.sh restart を実行した場合
サービスを再起動します

ワイルドカードパターンでファイルの種類を判定します。

filename="report.pdf"
case "$filename" in
    *.php | *.py | *.rb)
        echo "スクリプトファイルです"
        ;;
    *.txt | *.md | *.csv)
        echo "テキストファイルです"
        ;;
    *.jpg | *.png | *.gif)
        echo "画像ファイルです"
        ;;
    *.pdf)
        echo "PDF ファイルです"
        ;;
    *)
        echo "不明なファイル形式です"
        ;;
esac
PDF ファイルです

文字クラス『[0-9]』を使って数値の範囲を判定します。

score=85
case $score in
    9[0-9] | 100)
        echo "A(優)"
        ;;
    8[0-9])
        echo "B(良)"
        ;;
    7[0-9])
        echo "C(可)"
        ;;
    *)
        echo "D(不可)"
        ;;
esac
B(良)
概要

case のパターンはシェルのグロブパターン(ワイルドカード)であり、正規表現ではありません。正規表現マッチが必要な場合は if / [[ ]] の =~ 演算子 を使います。

パターンを『|』で区切ることで OR 条件を1つのブロックにまとめられます。これを if-elif と比較すると、case の方がすっきり書けて可読性が上がります。

『*)』のデフォルトパターンは省略可能ですが、想定外の入力への対処として必ず書くことを推奨します。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。