このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトのcase文

シェルスクリプトのcase文

 case文は、指定された文字列が特定のパターンにマッチするかを判断し、マッチしたパターンに対応する処理を実行するための制御構造です。複数の条件に基づいて異なる処理を行いたい場合に、if文よりも簡潔に記述できます。

case文の基本構造

まず、case文の基本的な構造を確認しましょう。

case <文字列> in
  <パターン1>)
    # 処理1
    ;;
  <パターン2>)
    # 処理2
    ;;
  *)
    # デフォルトの処理
    ;;
esac
  • <文字列>:評価対象の文字列や変数。
  • <パターン>:マッチさせたい文字列パターン。ワイルドカード(*?)が使用可能。
  • ;;:各パターンの処理の終了を示す。
  • *):上記のパターンにマッチしなかった場合のデフォルト処理。
  • esaccaseの終了を示す(caseを逆から綴ったもの)。

 case文は、指定された文字列が上から順に各パターンにマッチするかを評価し、マッチしたパターンの処理を実行します。どのパターンにもマッチしなければ、*パターンの処理を実行します。

例1:曜日に応じたメッセージ表示(weekday.sh

このスクリプトは、現在の曜日に応じて異なるメッセージを表示します。

スクリプトの作成

user01@ubuntu:~$ nano weekday.sh

weekday.shの内容

#!/bin/bash

day_of_week=$(date +%u)

case "$day_of_week" in
  1)
    echo "今日は月曜日です。1週間の始まりです。"
    ;;
  5)
    echo "今日は金曜日です。週末が近いです!"
    ;;
  6|7)
    echo "今日は週末です。ゆっくり休みましょう。"
    ;;
  *)
    echo "今日は平日です。頑張りましょう。"
    ;;
esac

解説

  • day_of_week=$(date +%u)dateコマンドで曜日を数値(1〜7)で取得します(1が月曜日、7が日曜日)。
  • case "$day_of_week" in:取得した曜日を評価します。
  • 6|7):土曜日(6)または日曜日(7)の場合にマッチします。
  • *):上記以外の場合(火〜木曜日)にマッチします。

実行権限の付与

user01@ubuntu:~$ chmod +x weekday.sh

スクリプトの実行

user01@ubuntu:~$ ./weekday.sh

実行結果の例

・月曜日の場合

今日は月曜日です。1週間の始まりです。

・金曜日の場合

今日は金曜日です。週末が近いです!

・土曜日または日曜日の場合

今日は週末です。ゆっくり休みましょう。

・火曜日〜木曜日の場合

今日は平日です。頑張りましょう。

解説

  • スクリプトは現在の曜日に応じて適切なメッセージを表示します。

例2:簡易電卓スクリプト(calculator.sh

このスクリプトは、コマンドライン引数で指定した演算子に応じて計算を行います。

スクリプトの作成

user01@ubuntu:~$ nano calculator.sh

calculator.shの内容

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "使用法: $0 数値1 演算子 数値2"
  echo "演算子: add, sub, mul, div"
  exit 1
fi

num1=$1
operator=$2
num2=$3

case "$operator" in
  add)
    result=$((num1 + num2))
    echo "$num1 + $num2 = $result"
    ;;
  sub)
    result=$((num1 - num2))
    echo "$num1 - $num2 = $result"
    ;;
  mul)
    result=$((num1 * num2))
    echo "$num1 * $num2 = $result"
    ;;
  div)
    if [ "$num2" -eq 0 ]; then
      echo "エラー: 0で割ることはできません。"
      exit 1
    fi
    result=$((num1 / num2))
    echo "$num1 / $num2 = $result"
    ;;
  *)
    echo "不正な演算子です。使用可能な演算子: add, sub, mul, div"
    exit 1
    ;;
esac

解説

  • if [ $# -ne 3 ]; then:引数が3つでなければ使用方法を表示して終了します。
  • num1operatornum2に引数を代入します。
  • case "$operator" in:演算子を評価します。
  • addsubmuldivの場合に対応する計算を行います。
  • divの場合、num2が0でないかを確認します。
  • *):不正な演算子が指定された場合のエラーメッセージを表示します。

実行権限の付与

user01@ubuntu:~$ chmod +x calculator.sh

スクリプトの実行

1.加算の例

user01@ubuntu:~$ ./calculator.sh 10 add 5
10 + 5 = 15

2.減算の例

user01@ubuntu:~$ ./calculator.sh 10 sub 3
10 - 3 = 7

3.乗算の例

user01@ubuntu:~$ ./calculator.sh 4 mul 6
4 * 6 = 24

4.除算の例

user01@ubuntu:~$ ./calculator.sh 20 div 4
20 / 4 = 5

5.0での除算エラーの例

user01@ubuntu:~$ ./calculator.sh 10 div 0
エラー: 0で割ることはできません。

6.不正な演算子の例

user01@ubuntu:~$ ./calculator.sh 10 mod 3
不正な演算子です。使用可能な演算子: add, sub, mul, div

解説

  • スクリプトは指定された演算子に応じて計算を行い、結果を表示します。
  • 不正な入力やエラー条件も適切に処理します。

作成したシェルスクリプトの削除

user01@ubuntu:~$ rm weekday.sh calculator.sh 

まとめ

  • case文の活用:指定した文字列がパターンにマッチするかを判断し、対応する処理を実行できます。複数の条件を扱う際にif文よりも簡潔に記述できます。
  • パターンの指定:ワイルドカード(*?)や複数のパターン(|)を使用して柔軟に条件を設定できます。
  • デフォルト処理*パターンを使用して、どのパターンにもマッチしなかった場合の処理を定義できます。
  • 実用的な例:曜日に応じたメッセージ表示や、演算子に基づく計算など、case文はさまざまな場面で活用できます。

 case文を使うことで、シェルスクリプトの可読性と効率性を向上させることができます。複雑な条件分岐を簡潔に記述できるため、スクリプトの保守性も高まります。ぜひ、実際のスクリプト作成でcase文を活用してみてください。