[Linux] case文の使い方 – パターンによる条件分岐

Linuxのcase文は、シェルスクリプトで条件分岐を行うための構文で、C言語のswitch文に似ています。

case文は、変数やコマンドの結果に基づいて複数のパターンを評価し、該当するパターンの処理を実行します。

基本的な構文は以下の通りです:

case 変数 in
  パターン1)
    コマンド1
    ;;
  パターン2)
    コマンド2
    ;;
  *)
    デフォルトの処理
    ;;
esac

*)はデフォルトの処理を示し、どのパターンにも一致しない場合に実行されます。

この記事でわかること
  • case文の基本構文と使い方
  • 条件分岐の実践例と応用方法
  • 注意点やパターンの重要性
  • ユーザー入力に基づく処理の実装
  • 環境変数を利用した設定の切り替え

目次から探す

case文とは

case文は、Bashスクリプトにおける条件分岐の一つで、特定の値に基づいて異なる処理を実行するための構文です。

if文と同様に条件に応じた処理を行いますが、複数の条件を簡潔に記述できる点が特徴です。

特に、同じ変数や値に対して複数の条件を設定する場合に、case文を使用することでコードの可読性が向上します。

case文は、指定した変数の値を評価し、各パターンに一致する場合に対応する処理を実行します。

これにより、複雑な条件分岐をシンプルに表現でき、スクリプトの保守性も高まります。

特に、ユーザー入力やコマンドの結果に基づく処理を行う際に非常に便利です。

case文の基本構文

case文の基本的な書き方

case文は以下の基本構文で記述します。

変数の値を評価し、各パターンに基づいて処理を分岐させます。

基本的な書き方は次の通りです。

case 変数名 in
    パターン1)
        # パターン1に一致した場合の処理
        ;;
    パターン2)
        # パターン2に一致した場合の処理
        ;;
    *)
        # どのパターンにも一致しない場合の処理
        ;;
esac

パターンマッチングの仕組み

case文では、指定した変数の値が各パターンに一致するかどうかを評価します。

パターンには文字列やワイルドカード*?を使用することができ、柔軟な条件分岐が可能です。

例えば、*は任意の文字列にマッチし、?は任意の1文字にマッチします。

これにより、特定の条件に基づいた処理を簡単に実装できます。

;;の役割と重要性

;;は、各パターンの処理が終了したことを示すために使用されます。

これにより、次のパターンの評価に移ることができます。

;;がない場合、次のパターンの処理が実行されてしまうため、意図しない動作を引き起こす可能性があります。

したがって、各パターンの最後には必ず;;を記述することが重要です。

*)によるデフォルト処理

*)は、すべてのパターンに一致しない場合のデフォルト処理を定義するために使用されます。

これにより、予期しない入力や条件に対しても適切な処理を行うことができます。

デフォルト処理を設定することで、スクリプトの堅牢性が向上し、エラー処理を簡潔に行うことが可能になります。

例えば、次のように記述します。

case $input in
    "yes")
        echo "Yesが選択されました。"
        ;;
    "no")
        echo "Noが選択されました。"
        ;;
    *)
        echo "無効な選択です。"
        ;;
esac

case文の実践例

単純な文字列の分岐

case文を使用して、ユーザーからの入力に基づいて異なるメッセージを表示する例です。

以下のコードでは、ユーザーが入力した文字列に応じて異なる処理を行います。

echo "好きな果物を入力してください(apple, banana, orange):"
read fruit
case $fruit in
    "apple")
        echo "リンゴが選ばれました。"
        ;;
    "banana")
        echo "バナナが選ばれました。"
        ;;
    "orange")
        echo "オレンジが選ばれました。"
        ;;
    *)
        echo "無効な果物です。"
        ;;
esac
好きな果物を入力してください(apple, banana, orange): apple
リンゴが選ばれました。

数値の分岐

数値に基づいて異なる処理を行う例です。

以下のコードでは、ユーザーが入力した数値に応じて異なるメッセージを表示します。

echo "1から3の数字を入力してください:"
read number
case $number in
    1)
        echo "数字は1です。"
        ;;
    2)
        echo "数字は2です。"
        ;;
    3)
        echo "数字は3です。"
        ;;
    *)
        echo "無効な数字です。"
        ;;
esac
1から3の数字を入力してください: 2
数字は2です。

複数のパターンをまとめて処理する方法

複数のパターンをまとめて同じ処理を行うことも可能です。

以下の例では、複数の果物に対して同じメッセージを表示します。

echo "好きな果物を入力してください(apple, banana, grape):"
read fruit
case $fruit in
    "apple" | "banana" | "grape")
        echo "$fruit はおいしい果物です!"
        ;;
    *)
        echo "無効な果物です。"
        ;;
esac
好きな果物を入力してください(apple, banana, grape): grape
grape はおいしい果物です!

コマンドの結果を使った分岐

case文は、コマンドの結果を使って条件分岐を行うこともできます。

以下の例では、ファイルの存在を確認し、その結果に基づいて処理を行います。

filename="test.txt"
case $(test -e $filename; echo $?) in
    0)
        echo "$filename は存在します。"
        ;;
    1)
        echo "$filename は存在しません。"
        ;;
esac
test.txt は存在します。

このように、case文を使うことで、さまざまな条件に基づいた処理を簡潔に記述することができます。

case文の応用

正規表現を使ったパターンマッチング

case文では、正規表現を使用してより柔軟なパターンマッチングを行うことができます。

以下の例では、ユーザーが入力した文字列が特定の形式に一致するかどうかを確認します。

echo "メールアドレスを入力してください:"
read email
case $email in
    *@*.*)
        echo "有効なメールアドレスです。"
        ;;
    *)
        echo "無効なメールアドレスです。"
        ;;
esac
メールアドレスを入力してください: example@example.com
有効なメールアドレスです。

複数の条件を組み合わせる方法

case文では、複数の条件を組み合わせて処理を行うことができます。

以下の例では、ユーザーの入力に応じて異なるメッセージを表示します。

echo "好きな色を入力してください(red, blue, green):"
read color
case $color in
    "red" | "blue")
        echo "暖色系の色が選ばれました。"
        ;;
    "green")
        echo "寒色系の色が選ばれました。"
        ;;
    *)
        echo "無効な色です。"
        ;;
esac
好きな色を入力してください(red, blue, green): blue
暖色系の色が選ばれました。

case文内での変数の使用

case文内で変数を使用することで、より動的な条件分岐が可能になります。

以下の例では、変数を使って異なる処理を行います。

echo "選択肢を入力してください(1, 2, 3):"
read choice
case $choice in
    1)
        message="選択肢1が選ばれました。"
        ;;
    2)
        message="選択肢2が選ばれました。"
        ;;
    3)
        message="選択肢3が選ばれました。"
        ;;
    *)
        message="無効な選択です。"
        ;;
esac
echo $message
選択肢を入力してください(1, 2, 3): 1
選択肢1が選ばれました。

case文とループの組み合わせ

case文はループと組み合わせて使用することもできます。

以下の例では、ユーザーが正しい入力をするまでループを続けます。

while true; do
    echo "好きな果物を入力してください(apple, banana, exitで終了):"
    read fruit
    case $fruit in
        "apple")
            echo "リンゴが選ばれました。"
            ;;
        "banana")
            echo "バナナが選ばれました。"
            ;;
        "exit")
            echo "終了します。"
            break
            ;;
        *)
            echo "無効な果物です。"
            ;;
    esac
done
好きな果物を入力してください(apple, banana, exitで終了): apple
リンゴが選ばれました。
好きな果物を入力してください(apple, banana, exitで終了): exit
終了します。

case文と関数の組み合わせ

case文は関数と組み合わせて使用することもできます。

以下の例では、関数を定義し、その中でcase文を使用しています。

function check_fruit {
    case $1 in
        "apple")
            echo "リンゴが選ばれました。"
            ;;
        "banana")
            echo "バナナが選ばれました。"
            ;;
        *)
            echo "無効な果物です。"
            ;;
    esac
}
echo "好きな果物を入力してください:"
read fruit
check_fruit $fruit
好きな果物を入力してください: banana
バナナが選ばれました。

このように、case文はさまざまな場面で応用が可能であり、スクリプトの柔軟性と可読性を向上させるために非常に便利です。

case文の注意点

パターンの順序が重要な理由

case文では、パターンの順序が非常に重要です。

最初に一致したパターンの処理が実行され、その後のパターンは無視されます。

したがって、特定の条件を優先的に処理したい場合は、その条件を上位に配置する必要があります。

例えば、以下のようなコードでは、"apple"が最初に来ているため、"apple pie"が一致しても"apple"の処理が優先されます。

case $fruit in
    "apple")
        echo "リンゴが選ばれました。"
        ;;
    "apple pie")
        echo "リンゴのパイが選ばれました。"
        ;;
    *)
        echo "無効な果物です。"
        ;;
esac
果物を入力してください: apple pie
リンゴが選ばれました。

パターンが一致しない場合の挙動

case文では、どのパターンにも一致しない場合、*)で定義されたデフォルト処理が実行されます。

デフォルト処理を設定していない場合、何も出力されないことになります。

これにより、予期しない入力に対しても適切な処理を行うことができるため、デフォルト処理を設定することが推奨されます。

以下の例では、無効な入力に対してメッセージを表示します。

echo "好きな果物を入力してください:"
read fruit
case $fruit in
    "apple" | "banana")
        echo "$fruit はおいしい果物です!"
        ;;
    *)
        echo "無効な果物です。"
        ;;
esac
好きな果物を入力してください: orange
無効な果物です。

複雑な条件分岐での可読性の確保

case文を使用することで、複雑な条件分岐を簡潔に記述できますが、あまりにも多くのパターンを追加すると可読性が低下する可能性があります。

特に、パターンが多岐にわたる場合は、適切なコメントや空行を挿入して可読性を保つことが重要です。

また、必要に応じて関数を使用して処理を分割することで、全体の構造を明確にすることができます。

以下の例では、コメントを追加して可読性を向上させています。

case $input in
    # フルーツの選択
    "apple")
        echo "リンゴが選ばれました。"
        ;;
    "banana")
        echo "バナナが選ばれました。"
        ;;
    # 野菜の選択
    "carrot")
        echo "ニンジンが選ばれました。"
        ;;
    "broccoli")
        echo "ブロッコリーが選ばれました。"
        ;;
    *)
        echo "無効な選択です。"
        ;;
esac

このように、case文を使用する際は、パターンの順序やデフォルト処理、可読性に注意を払いながら記述することが重要です。

これにより、スクリプトの保守性と理解しやすさが向上します。

実用的なcase文の使用例

ユーザー入力に基づくメニュー選択

case文を使用して、ユーザーが選択したメニューオプションに基づいて異なる処理を実行する例です。

以下のコードでは、ユーザーにメニューを表示し、選択に応じたメッセージを表示します。

echo "メニューを選択してください:"
echo "1) オプション1"
echo "2) オプション2"
echo "3) オプション3"
read choice
case $choice in
    1)
        echo "オプション1が選択されました。"
        ;;
    2)
        echo "オプション2が選択されました。"
        ;;
    3)
        echo "オプション3が選択されました。"
        ;;
    *)
        echo "無効な選択です。"
        ;;
esac
メニューを選択してください:
1) オプション1
2) オプション2
3) オプション3
選択: 2
オプション2が選択されました。

ファイル拡張子に基づく処理の分岐

ファイルの拡張子に基づいて異なる処理を行う例です。

以下のコードでは、指定されたファイルの拡張子に応じて異なるメッセージを表示します。

echo "ファイル名を入力してください:"
read filename
case "${filename##*.}" in
    "txt")
        echo "テキストファイルです。"
        ;;
    "jpg" | "png")
        echo "画像ファイルです。"
        ;;
    "sh")
        echo "シェルスクリプトファイルです。"
        ;;
    *)
        echo "未知のファイルタイプです。"
        ;;
esac
ファイル名を入力してください: example.jpg
画像ファイルです。

サービスの状態に応じた処理

サービスの状態に基づいて異なる処理を行う例です。

以下のコードでは、サービスの状態を確認し、その結果に応じてメッセージを表示します。

service_status="running"
case $service_status in
    "running")
        echo "サービスは実行中です。"
        ;;
    "stopped")
        echo "サービスは停止しています。"
        ;;
    "failed")
        echo "サービスは失敗しました。"
        ;;
    *)
        echo "不明なサービス状態です。"
        ;;
esac
サービスの状態: running
サービスは実行中です。

環境変数に基づく設定の切り替え

環境変数に基づいて設定を切り替える例です。

以下のコードでは、ENVという環境変数の値に応じて異なる設定を適用します。

echo "現在の環境: $ENV"
case $ENV in
    "development")
        echo "開発環境の設定を適用します。"
        ;;
    "production")
        echo "本番環境の設定を適用します。"
        ;;
    "testing")
        echo "テスト環境の設定を適用します。"
        ;;
    *)
        echo "無効な環境です。デフォルト設定を適用します。"
        ;;
esac
現在の環境: production
本番環境の設定を適用します。

このように、case文は実用的なシナリオで非常に役立ち、ユーザー入力やファイルの状態、環境変数に基づいて柔軟に処理を分岐させることができます。

よくある質問

case文とif文はどちらを使うべき?

case文とif文はどちらも条件分岐を行うための構文ですが、使用する場面によって適切な選択が異なります。

case文は、特定の変数の値に基づいて複数の条件を簡潔に記述できるため、同じ変数に対する複数の条件分岐が必要な場合に適しています。

一方、if文は、より複雑な条件式や論理演算を扱う場合に便利です。

したがって、条件の内容や数に応じて使い分けることが重要です。

case文で数値範囲を扱うことはできる?

case文自体は数値範囲を直接扱うことはできませんが、数値を特定の値にマッチさせることは可能です。

数値範囲を扱いたい場合は、if文を使用する方が適しています。

例えば、if文を使って数値が特定の範囲内にあるかどうかを確認し、その結果に基づいてcase文を使用することができます。

以下のように組み合わせて使用することが一般的です。

if [ $number -ge 1 ] && [ $number -le 10 ]; then
    case $number in
        1)
            echo "1が選ばれました。"
            ;;
        2)
            echo "2が選ばれました。"
            ;;
        *)
            echo "1から10の範囲内の他の数字が選ばれました。"
            ;;
    esac
else
    echo "範囲外の数字です。"
fi

case文のパターンにワイルドカードは使える?

はい、case文のパターンにはワイルドカードを使用することができます。

*は任意の文字列にマッチし、?は任意の1文字にマッチします。

これにより、特定のパターンに対して柔軟な条件分岐が可能になります。

例えば、以下のようにワイルドカードを使用して、特定の文字列パターンに一致する場合の処理を行うことができます。

case $filename in
    *.txt)
        echo "テキストファイルです。"
        ;;
    *.jpg | *.png)
        echo "画像ファイルです。"
        ;;
    *)
        echo "未知のファイルタイプです。"
        ;;
esac

このように、ワイルドカードを使うことで、より多様な条件に対応した処理を簡潔に記述することができます。

まとめ

この記事では、Bashにおけるcase文の基本的な使い方から応用例、注意点まで幅広く解説しました。

特に、case文を使用することで、複数の条件分岐を簡潔に記述できることや、ユーザー入力やファイルの状態に基づいて柔軟に処理を行う方法について具体的な例を通じて説明しました。

これを機に、実際のスクリプト作成にcase文を活用し、より効率的な条件分岐を実現してみてください。

  • URLをコピーしました!
目次から探す