if文の代替 case文について【シェルスクリプト】

シェルスクリプトのcaseについて

if文と同じように条件に応じて、分岐処理ができる「case」があります。私は普段はif文で使用するので今まであまり利用する事がありませんでしたが、今回はcase について説明します。

case文は、シェルスクリプトで複数の条件で処理する事ができます。数値の比較や文字列のパターンマッチで一致した際に、処理を分岐できます。
簡単な構文は以下となります。

    • case 値 in  case文の開始で、case $str in のように比較対象の変数を設定します。
    • パターン1 )  比較対象の変数が、パターンマッチする条件を指定します。一致する条件はワイルドカードや正規表現を使用できます。
    • 処理1 ;; 条件に一致した際に実行するコマンドや処理を書きます。「;;」はコマンドの終了を意味します
case 値 in
  パターン1 ) 処理1 ;;
  パターン2 ) 処理2 ;;
  パターン3 ) 処理3 ;;
  …
  パターンn ) 処理n ;;
esac

数値でパターンマッチした場合のケース

変数の数値と一致した際に分岐したい場合は下記のようなスクリプトが利用できます。
変数の数値に応じてメッセージを分岐しています。1から3以外の数字を入力した際に分岐して、その変数にそったメッセージを表示しています

#!/bin/bash
echo "数字を入力してください: "
read number

case $number in
  1)
    echo "選択された数字は1です"
    ;;
  2)
    echo "選択された数字は2です"
    ;;
  3)
    echo "選択された数字は3です"
    ;;
  *)
    echo "1から3の数字を入力してください"
    ;;
esac

複数のパターンにマッチする場合のケース

同じ処理を複数の値で行いたい場合、パターンを「|」で区切ることができます。
下記では、mon, tue, wed のような曜日の入力を促し、「mon」または「Mon」が入力された場合、同じメッセージが表示されます。
複数の条件を|で繋げることで、異なる入力に対して同じ処理を行うことができます。

#!/bin/bash
echo "曜日を入力してください (mon, tue, wed): "
read day

case $day in
  mon|Mon)
    echo "今日は月曜日です"
    ;;
  tue|Tue)
    echo "今日は火曜日です"
    ;;
  wed|Wed)
    echo "今日は水曜日です"
    ;;
  *)
    echo "不正な曜日です"
    ;;
esac

正規表現的なパターンマッチ

case文ではワイルドカードを使ったパターンマッチも可能です。

  • *:任意の文字列
  • ?:任意の1文字
  • [ ]:文字の範囲

このスクリプトは、入力されたファイル名の拡張子に応じてメッセージを表示します。例えば、「*.txt」のようにワイルドカードを使って、テキストファイルや画像ファイルを判断しています。

#!/bin/bash
echo "ファイル名を入力してください: "
read filename

case $filename in
  *.txt)
    echo "テキストファイルです"
    ;;
  *.jpg|*.png)
    echo "画像ファイルです"
    ;;
  *)
    echo "不明なファイル形式です"
    ;;
esac