Bash

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

Linuxのcase文は、特定の値やパターンに基づいて条件分岐を行う制御構文です。

主にシェルスクリプトで使用され、複数の条件を簡潔に記述できます。

構文はcase 値 in パターン1) 処理 ;; パターン2) 処理 ;; esacの形式で、が各パターンに一致する場合に対応する処理を実行します。

ワイルドカードや正規表現も利用可能で、*)を用いてデフォルト処理を指定できます。

case文とは何か

case文は、プログラミングにおける条件分岐の一つで、特定の値に基づいて異なる処理を実行するための構文です。

主に、複数の条件を簡潔に記述する際に使用されます。

特に、if文を使った場合に比べて、可読性が高く、コードがすっきりとします。

Linuxのシェルスクリプトやプログラミング言語の中で広く使われており、特定の変数の値に応じて異なる処理を行うことができます。

これにより、複雑な条件分岐をシンプルに表現できるため、プログラムの保守性が向上します。

以下は、case文の基本的な特徴です。

特徴説明
可読性複数の条件を簡潔に記述できる
処理の分岐特定の値に基づいて異なる処理を実行可能
保守性コードがすっきりし、変更が容易になる

case文を使うことで、プログラムのロジックを明確にし、エラーを減らすことができます。

次のセクションでは、case文の基本構文について詳しく見ていきます。

case文の基本構文

case文の基本構文は、特定の変数の値に基づいて異なる処理を実行するための形式です。

以下に、一般的な構文を示します。

case 変数名 in
    値1)
        # 値1に対する処理
        ;;
    値2)
        # 値2に対する処理
        ;;
    *)
        # どの値にも一致しない場合の処理
        ;;
esac

構文の要素

  • 変数名: 条件を評価する対象の変数です。
  • 値1, 値2: 変数が一致する可能性のある値です。
  • 処理: 各値に対して実行されるコマンドやスクリプトです。
  • ;;: 各ケースの終了を示します。
  • *: どの条件にも一致しない場合のデフォルト処理を示します。
  • esac: case文の終了を示します。

以下は、case文の具体的な例です。

read -p "曜日を入力してください: " day
case $day in
    月曜日)
        echo "今日は月曜日です。"
        ;;
    火曜日)
        echo "今日は火曜日です。"
        ;;
    水曜日)
        echo "今日は水曜日です。"
        ;;
    *)
        echo "指定された曜日ではありません。"
        ;;
esac

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

もし入力が「月曜日」であれば「今日は月曜日です。」と表示されます。

入力がどの曜日にも一致しない場合は「指定された曜日ではありません。」と表示されます。

case文の基本構文を理解することで、条件分岐を効果的に活用できるようになります。

次のセクションでは、case文の使い方について詳しく見ていきます。

case文の使い方

case文は、特定の変数の値に基づいて異なる処理を実行するために使用されます。

ここでは、case文の具体的な使い方をいくつかの例を通じて説明します。

基本的な使い方

case文は、特定の条件に応じて異なるコマンドを実行する際に非常に便利です。

以下は、基本的な使い方の例です。

read -p "好きな果物を入力してください: " fruit
case $fruit in
    りんご)
        echo "りんごは赤い果物です。"
        ;;
    バナナ)
        echo "バナナは黄色い果物です。"
        ;;
    みかん)
        echo "みかんはオレンジ色の果物です。"
        ;;
    *)
        echo "その果物はリストにありません。"
        ;;
esac

このスクリプトでは、ユーザーが好きな果物を入力すると、その果物に応じたメッセージが表示されます。

もし入力が「りんご」であれば「りんごは赤い果物です。」と表示されます。

複数の条件をまとめる

case文では、複数の条件をまとめて処理することも可能です。

以下の例では、同じ処理を複数の値に対して実行しています。

read -p "好きな色を入力してください: " color
case $color in
    赤|青|緑)
        echo "あなたは明るい色が好きですね!"
        ;;
    黒|白)
        echo "あなたはモノトーンが好きですね!"
        ;;
    *)
        echo "その色はリストにありません。"
        ;;
esac

この例では、赤、青、緑のいずれかが入力された場合に同じメッセージが表示されます。

これにより、コードが簡潔になり、可読性が向上します。

数値の条件分岐

case文は数値の条件分岐にも使用できます。

以下の例では、数値に基づいて異なるメッセージを表示します。

read -p "数字を入力してください (1-3): " number
case $number in
    1)
        echo "あなたは1を選びました。"
        ;;
    2)
        echo "あなたは2を選びました。"
        ;;
    3)
        echo "あなたは3を選びました。"
        ;;
    *)
        echo "無効な数字です。"
        ;;
esac

このスクリプトでは、1から3の数字が入力された場合にそれぞれのメッセージが表示されます。

無効な数字が入力された場合は「無効な数字です。」と表示されます。

case文を使うことで、条件分岐を簡潔に記述でき、プログラムの可読性と保守性が向上します。

次のセクションでは、case文の実践例を見ていきます。

実践例:case文を使ったスクリプト

ここでは、case文を使った実践的なスクリプトの例をいくつか紹介します。

これにより、case文の使い方を具体的に理解し、実際のプログラムに応用できるようになります。

例1: ユーザーの選択に基づくメニュー

以下のスクリプトは、ユーザーにメニューを表示し、選択に応じた処理を実行します。

echo "メニューを選択してください:"
echo "1) ファイルの作成"
echo "2) ファイルの削除"
echo "3) ファイルの表示"
echo "4) 終了"
read -p "選択: " choice
case $choice in
    1)
        read -p "作成するファイル名: " filename
        touch "$filename"
        echo "$filename を作成しました。"
        ;;
    2)
        read -p "削除するファイル名: " filename
        rm "$filename"
        echo "$filename を削除しました。"
        ;;
    3)
        read -p "表示するファイル名: " filename
        cat "$filename"
        ;;
    4)
        echo "プログラムを終了します。"
        ;;
    *)
        echo "無効な選択です。"
        ;;
esac

このスクリプトでは、ユーザーが選択したメニューに応じて、ファイルの作成、削除、表示を行います。

無効な選択がされた場合はエラーメッセージが表示されます。

例2: 簡易な計算機

次のスクリプトは、簡単な計算機の機能を持っています。

ユーザーが選択した演算に基づいて計算を行います。

echo "計算機メニュー:"
echo "1) 足し算"
echo "2) 引き算"
echo "3) 掛け算"
echo "4) 割り算"
read -p "選択: " operation
read -p "1つ目の数字: " num1
read -p "2つ目の数字: " num2
case $operation in
    1)
        result=$((num1 + num2))
        echo "$num1 + $num2 = $result"
        ;;
    2)
        result=$((num1 - num2))
        echo "$num1 - $num2 = $result"
        ;;
    3)
        result=$((num1 * num2))
        echo "$num1 * $num2 = $result"
        ;;
    4)
        if [ $num2 -ne 0 ]; then
            result=$((num1 / num2))
            echo "$num1 / $num2 = $result"
        else
            echo "ゼロで割ることはできません。"
        fi
        ;;
    *)
        echo "無効な選択です。"
        ;;
esac

このスクリプトでは、ユーザーが選択した演算に基づいて計算を行い、結果を表示します。

割り算の場合は、ゼロで割ることができないため、そのチェックも行っています。

例3: 簡易な天気予報システム

以下のスクリプトは、ユーザーが入力した天気に基づいてアドバイスを提供します。

echo "今日の天気を入力してください (晴れ、雨、雪): "
read weather
case $weather in
    晴れ)
        echo "今日は外に出かけましょう!"
        ;;
    雨)
        echo "傘を持って行くことをお勧めします。"
        ;;
    雪)
        echo "暖かい服装をしてください。"
        ;;
    *)
        echo "無効な天気です。"
        ;;
esac

このスクリプトでは、ユーザーが入力した天気に応じて異なるアドバイスを表示します。

無効な天気が入力された場合はエラーメッセージが表示されます。

これらの実践例を通じて、case文の使い方を具体的に理解し、さまざまなシナリオでの応用が可能になります。

次のセクションでは、case文の応用テクニックについて詳しく見ていきます。

case文の応用テクニック

case文は、基本的な条件分岐だけでなく、さまざまな応用が可能です。

ここでは、case文をより効果的に活用するためのテクニックをいくつか紹介します。

1. 正規表現を使った条件分岐

case文では、パターンマッチングに正規表現を使用することができます。

これにより、より柔軟な条件分岐が可能になります。

以下は、正規表現を使った例です。

read -p "ファイル名を入力してください: " filename
case $filename in
    *.txt)
        echo "$filename はテキストファイルです。"
        ;;
    *.jpg|*.png)
        echo "$filename は画像ファイルです。"
        ;;
    *)
        echo "$filename は未知のファイルタイプです。"
        ;;
esac

この例では、入力されたファイル名の拡張子に基づいて、ファイルの種類を判別しています。

2. 複数の条件をグループ化

case文では、複数の条件をグループ化して同じ処理を実行することができます。

これにより、コードが簡潔になり、可読性が向上します。

read -p "好きな飲み物を入力してください: " drink
case $drink in
    コーヒー|紅茶|緑茶)
        echo "あなたは温かい飲み物が好きですね!"
        ;;
    ジュース|水|炭酸水)
        echo "あなたは冷たい飲み物が好きですね!"
        ;;
    *)
        echo "その飲み物はリストにありません。"
        ;;
esac

この例では、温かい飲み物と冷たい飲み物をグループ化して、同じメッセージを表示しています。

3. ネストしたcase文

case文は、他のcase文をネストして使用することも可能です。

これにより、複雑な条件分岐を整理することができます。

read -p "曜日を入力してください: " day
case $day in
    月曜日|火曜日|水曜日|木曜日|金曜日)
        echo "$day は平日です。"
        case $day in
            月曜日)
                echo "今週の始まりですね。"
                ;;
            金曜日)
                echo "週末が近づいています!"
                ;;
        esac
        ;;
    土曜日|日曜日)
        echo "$day は週末です。"
        ;;
    *)
        echo "無効な曜日です。"
        ;;
esac

この例では、最初のcase文で平日か週末かを判別し、平日の場合はさらにネストしたcase文で特定の曜日に応じたメッセージを表示しています。

4. デフォルト処理の活用

case文では、すべての条件に一致しない場合のデフォルト処理を設定することができます。

これにより、予期しない入力に対しても適切な対応が可能です。

read -p "好きな季節を入力してください (春、夏、秋、冬): " season
case $season in
    春)
        echo "春は花が咲く季節です。"
        ;;
    夏)
        echo "夏は暑い季節です。"
        ;;
    秋)
        echo "秋は紅葉が美しい季節です。"
        ;;
    冬)
        echo "冬は雪が降る季節です。"
        ;;
    *)
        echo "無効な季節です。春、夏、秋、冬のいずれかを入力してください。"
        ;;
esac

この例では、無効な季節が入力された場合に、具体的な指示を提供しています。

これらの応用テクニックを活用することで、case文をより効果的に使いこなすことができ、プログラムの柔軟性と可読性を向上させることができます。

次のセクションでは、case文を使う際の注意点について詳しく見ていきます。

case文を使う際の注意点

case文は非常に便利な条件分岐の手段ですが、使用する際にはいくつかの注意点があります。

これらを理解しておくことで、より効果的にcase文を活用できるようになります。

1. パターンの順序

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

最初に一致したパターンが実行されるため、特定の条件を優先的に処理したい場合は、上位に配置する必要があります。

case $value in
    1)
        echo "値は1です。"
        ;;
    1*)
        echo "値は1で始まります。"
        ;;
    *)
        echo "その他の値です。"
        ;;
esac

この例では、11*のパターンがあり、1が最初に一致するため、1が入力された場合は「値は1です。」と表示されます。

1*は実行されません。

2. ワイルドカードの使用

case文では、ワイルドカード*?を使用してパターンを指定できますが、使い方には注意が必要です。

特に、*はすべての文字列に一致するため、意図しないマッチングを引き起こす可能性があります。

case $input in
    *)
        echo "すべての入力に一致します。"
        ;;
esac

この場合、どんな入力でも一致してしまうため、他の条件が無視されることになります。

3. 変数の引用

case文で使用する変数は、適切に引用することが重要です。

特に、変数に空白や特殊文字が含まれる場合、引用を忘れると意図しない動作を引き起こすことがあります。

read -p "ファイル名を入力してください: " filename
case "$filename" in
    *.txt)
        echo "$filename はテキストファイルです。"
        ;;
    *)
        echo "$filename は未知のファイルタイプです。"
        ;;
esac

この例では、変数$filenameを引用することで、空白や特殊文字が含まれていても正しく処理されます。

4. デフォルト処理の設定

case文では、すべての条件に一致しない場合のデフォルト処理を設定することができますが、必ず設定することをお勧めします。

これにより、予期しない入力に対しても適切な対応が可能になります。

case $input in
    yes)
        echo "はいが選択されました。"
        ;;
    no)
        echo "いいえが選択されました。"
        ;;
    *)
        echo "無効な選択です。yesまたはnoを入力してください。"
        ;;
esac

この例では、無効な選択がされた場合にエラーメッセージを表示しています。

5. コメントの活用

case文が複雑になる場合、各ケースにコメントを追加することで、コードの可読性を向上させることができます。

特に、他の人がコードを読む際に理解しやすくなります。

case $option in
    start)
        # プログラムを開始する
        start_program
        ;;
    stop)
        # プログラムを停止する
        stop_program
        ;;
    *)
        # 無効なオプション
        echo "無効なオプションです。"
        ;;
esac

このように、コメントを追加することで、コードの意図が明確になります。

これらの注意点を考慮することで、case文をより効果的に活用し、エラーを減らすことができます。

まとめ

この記事では、Linuxのcase文について、その基本的な構文や使い方、実践例、応用テクニック、注意点を詳しく解説しました。

case文を活用することで、条件分岐をより効率的に行うことができ、プログラムの可読性や保守性が向上します。

ぜひ、実際のスクリプト作成にcase文を取り入れて、より柔軟で効果的なプログラムを作成してみてください。

関連記事

Back to top button