前回の記事(入門8)では、シェルスクリプトの条件分岐の基本である if 文と「終了ステータス($?)」の重要性について解説しました。
今回は、もう一つの重要な条件分岐である「case文」を解説します。特定の一つの値(文字列)に対して、分岐が「3つ以上」に増える場合、if や elif を重ねるよりも case 文を使った方がコードが劇的にスッキリし、可読性が上がります。
実務で非常によく使われる「起動オプションの判定」や「対話型でのYes/No確認」などの具体例を交えて、正しい書き方をマスターしましょう!
1. case文の基本構文と特徴的な記号ルール
シェルスクリプトの case 文は、他の言語でいう switch 文にあたります。基本構造は以下のようになります。
case "$変数" in
"パターン1")
# パターン1に一致した時の処理
;;
"パターン2")
# パターン2に一致した時の処理
;;
*)
# どのパターンにも一致しなかった時の処理(デフォルト)
;;
esac💡 初心者が知っておくべき3つのルール
inとesac:caseはinで始まり、最後はcaseを逆から読んだesacで閉じます。- 処理の終わりを示す
;;(ダブルセミコロン):
各パターンの処理の最後には、必ず;;を記述します。これが他の言語のbreakにあたり、「ここでこのパターンの処理は終わり」という印になります。 - その他すべてを表す
*):
どの条件にも合致しなかった場合のフォールバック(デフォルト処理)には*)を使用します。予期せぬ入力があった際のエラーハンドリングとして、実務では必須の記述です。
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 でも大文字の Y や yes でも、同じ処理グループにすっきりとマッピングさせることができます。
3. if文とcase文の使い分け基準
どちらを使うべきか迷った時は、以下の基準で判断します。
| 構文 | 適した用途 | 苦手な用途 |
|---|---|---|
| if文 | 数値の範囲(-gt等)や、複数変数の複雑な論理結合(&&/||) | 1つの変数の値に対する大量の等値比較(コードが冗長になる) |
| case文 | 1つの変数の値(文字列)に対する、多数のパターン分岐 | 数値の大小関係(「10以上」など)の判定や、複雑な条件式 |
特に、判定したい条件が「文字列の完全一致(または前方一致などのパターン)」であり、分岐が3つ以上になる場合は、迷わず case 文を選択するのがベストプラクティスです。
4. まとめ
シェルスクリプトの case 文は、「1つの値に対する多方向の分岐」をシンプルかつ安全に書くための非常に強力な構文です。
;; や *) などの独特の記法に最初は少し戸惑うかもしれませんが、一度書き方を覚えてしまえば、引数処理や対話型の制御など、実務で書くスクリプトの可読性が格段に向上します。ぜひマスターしましょう!

コメント