case コマンド

シェルスクリプトでパターンマッチングに基づく条件分岐を実行します。

概要

case文はシェルの構文で、パターンマッチングに基づいて複数の条件分岐を可能にします。単一の値を複数のパターンと比較する場合、複数のif-else文よりも読みやすく効率的です。case文は、コマンドライン引数の処理、メニュー選択、または複数の条件チェックが必要な状況でシェルスクリプトでよく使用されます。

構文

case 単語 in
  パターン1)
    コマンド1
    ;;
  パターン2)
    コマンド2
    ;;
  *)
    デフォルトコマンド
    ;;
esac

使用例

基本的なパターンマッチング

$ cat example.sh
#!/bin/bash
fruit="apple"

case "$fruit" in
  "apple")
    echo "これはリンゴです。"
    ;;
  "banana")
    echo "これはバナナです。"
    ;;
  *)
    echo "これは他のものです。"
    ;;
esac

$ ./example.sh
これはリンゴです。

一つのアクションに対する複数のパターン

$ cat example2.sh
#!/bin/bash
fruit="pear"

case "$fruit" in
  "apple"|"pear"|"peach")
    echo "これは仁果類または核果類です。"
    ;;
  "banana"|"pineapple")
    echo "これは熱帯果実です。"
    ;;
  *)
    echo "不明な果物タイプです。"
    ;;
esac

$ ./example2.sh
これは仁果類または核果類です。

コマンドライン引数の処理

$ cat options.sh
#!/bin/bash

case "$1" in
  -h|--help)
    echo "使用法: $0 [オプション]"
    echo "オプション:"
    echo "  -h, --help     このヘルプメッセージを表示"
    echo "  -v, --version  バージョン情報を表示"
    ;;
  -v|--version)
    echo "バージョン 1.0"
    ;;
  *)
    echo "不明なオプション: $1"
    echo "詳細は --help を使用してください。"
    ;;
esac

$ ./options.sh --help
使用法: ./options.sh [オプション]
オプション:
  -h, --help     このヘルプメッセージを表示
  -v, --version  バージョン情報を表示

ワイルドカードを使用したパターンマッチング

$ cat wildcard.sh
#!/bin/bash
filename="document.txt"

case "$filename" in
  *.txt)
    echo "テキストファイル"
    ;;
  *.jpg|*.png|*.gif)
    echo "画像ファイル"
    ;;
  *.sh)
    echo "シェルスクリプト"
    ;;
  *)
    echo "不明なファイルタイプ"
    ;;
esac

$ ./wildcard.sh
テキストファイル

ヒント

フォールスルーに ;& または ;;& を使用する(Bash 4以降)

Bash 4以降では、;& を使用して次のパターンをテストせずに続行するか、;;& を使用して次のパターンをテストできます:

case "$var" in
  pattern1)
    echo "pattern1に一致"
    ;& # 次のパターンにフォールスルー
  pattern2)
    echo "pattern1が一致した場合、これも実行される"
    ;;
esac

パイプ記号でパターンを組み合わせる

パイプ記号 | を使用して、同じアクションに対して複数のパターンを一致させます:

case "$var" in
  yes|y|Y)
    echo "肯定的"
    ;;
esac

常にデフォルトケースを含める

予期しない入力を処理するために、* を使用してデフォルトケースを含めます:

case "$var" in
  # 他のパターン
  *)
    echo "一致するものが見つかりません"
    ;;
esac

変数の周りに引用符を使用する

単語分割とグロブを防ぐために、常に変数を引用符で囲みます:

case "$variable" in
  # パターン
esac

よくある質問

Q1. caseif-else文とどう違いますか?

A. caseは単一の値を複数のパターンと比較する場合、より読みやすく効率的です。一般的な条件論理ではなく、特にパターンマッチング用に設計されています。

Q2. caseパターンで正規表現を使用できますか?

A. caseは正規表現ではなく、シェルのパターンマッチング(グロビング)を使用します。*?などのワイルドカードや[a-z]などの文字クラスは使用できますが、+\dなどの正規表現構文は使用できません。

Q3. case文で任意のパターンに一致させるにはどうすればよいですか?

A. パターンとして*を使用すると、何にでも一致します。これは通常、デフォルトケースとして使用されます。

Q4. 数値比較でcaseを使用できますか?

A. はい、ただし構文に注意する必要があります。例えば:

case $number in
  [0-9]) echo "1桁" ;;
  [0-9][0-9]) echo "2桁" ;;
  *) echo "2桁以上または数字ではない" ;;
esac

参考文献

https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html

改訂履歴