現場で使えるシェルスクリプト入門9:case文によるパターン分岐と実務での活用法

シェルスクリプト IT

前回の記事(入門8)では、シェルスクリプトの条件分岐の基本である if 文と「終了ステータス($?)」の重要性について解説しました。

今回は、もう一つの重要な条件分岐である「case文」を解説します。特定の一つの値(文字列)に対して、分岐が「3つ以上」に増える場合、ifelif を重ねるよりも case 文を使った方がコードが劇的にスッキリし、可読性が上がります。

実務で非常によく使われる「起動オプションの判定」や「対話型でのYes/No確認」などの具体例を交えて、正しい書き方をマスターしましょう!

1. case文の基本構文と特徴的な記号ルール

シェルスクリプトの case 文は、他の言語でいう switch 文にあたります。基本構造は以下のようになります。

case "$変数" in
    "パターン1")
        # パターン1に一致した時の処理
        ;;
    "パターン2")
        # パターン2に一致した時の処理
        ;;
    *)
        # どのパターンにも一致しなかった時の処理(デフォルト)
        ;;
esac

💡 初心者が知っておくべき3つのルール

  1. inesac:
    casein で始まり、最後は case を逆から読んだ esacで閉じます。
  2. 処理の終わりを示す ;;(ダブルセミコロン):
    各パターンの処理の最後には、必ず ;; を記述します。これが他の言語の break にあたり、「ここでこのパターンの処理は終わり」という印になります。
  3. その他すべてを表す *):
    どの条件にも合致しなかった場合のフォールバック(デフォルト処理)には *) を使用します。予期せぬ入力があった際のエラーハンドリングとして、実務では必須の記述です。

2. case文の実用例

① 起動引数(start / stop / restart)の制御

システムのデーモン(サービス)起動スクリプトなどで最も定番の書き方です。第1引数($1)の値によって処理を切り替えます。

case "$1" in
    "start")
        echo "サービスを起動します..."
        # 起動処理をここに書く
        ;;
    "stop")
        echo "サービスを停止します..."
        # 停止処理をここに書く
        ;;
    "restart")
        echo "サービスを再起動します..."
        # 再起動処理をここに書く
        ;;
    *)
        echo "使い方: $0 {start|stop|restart}" >&2
        exit 1
        ;;
esac

② パイプ記号 | を使った複数条件(OR)と対話型Yes/No判定

パターンの部分に |(パイプ記号)を挟むことで、「いずれかに一致すれば良い(OR条件)」を表現できます。
以下は、ユーザーに入力を促して挙動を変える対話型スクリプトの例です。

read -p "処理を続行しますか? (y/n): " answer

case "$answer" in
    "y" | "Y" | "yes" | "Yes")
        echo "処理を続行します。"
        ;;
    "n" | "N" | "no" | "No")
        echo "処理を中止しました。"
        exit 0
        ;;
    *)
        echo "無効な入力です。処理を中断します。" >&2
        exit 1
        ;;
esac

このように、小文字の y でも大文字の Yyes でも、同じ処理グループにすっきりとマッピングさせることができます。

3. if文とcase文の使い分け基準

どちらを使うべきか迷った時は、以下の基準で判断します。

構文適した用途苦手な用途
if文数値の範囲(-gt等)や、複数変数の複雑な論理結合(&&/||1つの変数の値に対する大量の等値比較(コードが冗長になる)
case文1つの変数の値(文字列)に対する、多数のパターン分岐数値の大小関係(「10以上」など)の判定や、複雑な条件式

特に、判定したい条件が「文字列の完全一致(または前方一致などのパターン)」であり、分岐が3つ以上になる場合は、迷わず case 文を選択するのがベストプラクティスです。

4. まとめ

シェルスクリプトの case 文は、「1つの値に対する多方向の分岐」をシンプルかつ安全に書くための非常に強力な構文です。

;;*) などの独特の記法に最初は少し戸惑うかもしれませんが、一度書き方を覚えてしまえば、引数処理や対話型の制御など、実務で書くスクリプトの可読性が格段に向上します。ぜひマスターしましょう!

コメント

タイトルとURLをコピーしました