Linuxシェルスクリプトを書くうえで避けて通れないのが「条件分岐」です。
「if文」はよく知られていますが、複数の条件を分岐させたいときには「case文」がとても便利です。
特に、ユーザーの入力内容や、引数によって処理を変えたい場合にcase
を使うことで、スクリプトを見やすく、管理しやすくすることができます。
本記事では、Linuxシェルでのcase
文の基本的な構文から実践的な使い方まで、やさしく丁寧に解説します。
シェルスクリプト初心者の方はもちろん、条件分岐をもっとスマートに書きたい中級者の方にもおすすめです。
まずは、case文の基本的な形を押さえておきましょう。
case 変数 in
パターン1)
コマンド1
;;
パターン2)
コマンド2
;;
*)
デフォルトのコマンド
;;
esac
case
:分岐を開始します。変数
:評価対象となる変数です。パターン
:マッチさせたい文字列のパターン(ワイルドカードも使えます)。)
:パターンの終わりを示します。;;
:その分岐の終わりを示します。*
:どのパターンにも一致しないときのデフォルト。esac
:caseの終了(caseを逆に書いただけです)。ここでは、ユーザーに「今日は何曜日?」と聞いて、曜日ごとにメッセージを変えるスクリプトを作ってみましょう。
#!/bin/bash
echo "今日は何曜日ですか?(mon/tue/wed/thu/fri/sat/sun)"
read day
case $day in
mon)
echo "月曜日ですね。今週もがんばりましょう!"
;;
tue)
echo "火曜日です。まだ週は始まったばかりです。"
;;
wed)
echo "水曜日!週の真ん中ですね。"
;;
thu)
echo "木曜日、あと少しで週末です!"
;;
fri)
echo "金曜日!もうひと踏ん張り!"
;;
sat|sun)
echo "週末ですね。ゆっくり休みましょう。"
;;
*)
echo "入力が正しくありません。mon〜sunで入力してください。"
;;
esac
このスクリプトでは、read
コマンドで入力を受け取り、その値に応じてメッセージを切り替えています。
また、sat|sun
のようにパイプ記号で複数パターンに対応する書き方もできます。
シェルスクリプトでよくある使い方として、「コマンドライン引数によって処理を分ける」というものがあります。
たとえば、次のようなスクリプトを考えてみましょう。
#!/bin/bash
case "$1" in
start)
echo "サービスを開始します。"
# systemctl start myservice など
;;
stop)
echo "サービスを停止します。"
# systemctl stop myservice など
;;
restart)
echo "サービスを再起動します。"
# systemctl restart myservice など
;;
status)
echo "サービスの状態を表示します。"
# systemctl status myservice など
;;
*)
echo "使い方: $0 {start|stop|restart|status}"
;;
esac
このように、case "$1"
とすることで、スクリプトに渡された引数に応じて処理を切り替えることができます。
多くのLinux標準スクリプトもこのような構造でできており、実用性の高い書き方です。
case文では「*」「?」「[…]」といったワイルドカードも使えます。
たとえば以下のように、ファイル拡張子によって処理を変える例を見てみましょう。
#!/bin/bash
filename="$1"
case "$filename" in
*.jpg|*.png|*.gif)
echo "画像ファイルです。"
;;
*.mp4|*.mov)
echo "動画ファイルです。"
;;
*.txt)
echo "テキストファイルです。"
;;
*)
echo "未対応のファイル形式です。"
;;
esac
ここでは、渡されたファイル名の拡張子に応じて、適切なコメントを出力しています。
このように、パターンマッチを活用することで、if文よりもずっとスッキリとした条件分岐が可能です。
case文は関数と組み合わせることで、より保守性の高いスクリプトになります。
以下のように処理ごとに関数を定義しておくと、コードの再利用性も上がります。
#!/bin/bash
start_service() {
echo "サービスを開始します。"
}
stop_service() {
echo "サービスを停止します。"
}
case "$1" in
start)
start_service
;;
stop)
stop_service
;;
*)
echo "使い方: $0 {start|stop}"
;;
esac
処理が増えてきたときにも、関数化しておくことでコードがスッキリします。
チームでのスクリプト開発やメンテナンスもぐっと楽になるのでおすすめです。
便利なcase文ですが、いくつか注意点もあります。
*.txt
と書くつもりが.txt
だけにしてしまうと、マッチしません。;;
をつける必要があります。これを忘れると予期せぬ動作をすることがあります。"$変数"
のようにクオートすることで安全に処理できます。Linuxシェルスクリプトでの条件分岐は、if
文だけでなくcase
文もぜひ使いこなしたいテクニックです。
特に「値のパターンに応じて処理を切り替える」ような場面では、case
文が非常に読みやすく、保守性も高くなります。
今回は基本構文から実践的な応用、関数との組み合わせ、注意点までを解説しました。
日々のスクリプト作成に、ぜひcase
文を取り入れてみてください。
きっと、よりスマートでエレガントなコードが書けるようになりますよ。