logo

Bash スクリプト – Case ステートメント

ケースステートメント bash スクリプトでは、複数の選択肢に対して決定を下す必要がある場合に使用されます。言い換えれば、式が複数の値を持つ可能性がある場合に便利です。この方法は、スクリプト内の複数の if ステートメントの代替として見ることができます。 Case ステートメントは、コードの可読性が向上し、保守が容易であるため、if ステートメントよりも優れています。 Bash スクリプトの Case ステートメントは、C 言語の Case ステートメントと非常に似ています。ただし、C とは異なり、Bash Case ステートメントは一致が発生するとすぐに検索の続行を停止します。簡単に言えば、パターンの検索をさらに停止するために C で使用することが必須である Break ステートメントは必要ありません。

case ステートメントの基本的な構文を以下に示します。



構文:

case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac>

case ステートメントがどのように機能するかは次のとおりです。

  • EXPRESSION>一致を見つけるためにさまざまなパターン (ケース) に対して評価される変数または値です。
  • case ステートメントはキーワードで始まりますcase>続いてEXPRESSION>評価されること。
  • 各ケースは次のように定義されます。Pattern_Case>と比較される特定の値またはパターンを表すEXPRESSION>
  • それぞれの後にPattern_Case>、次の場合に実行されるステートメントがあります。EXPRESSION>特定のものと一致しますPattern_Case>。これらのステートメントは次のように表されます。STATEMENTS>
  • ;;>それぞれの終わりにSTATEMENTS>block は case ブロックの終わりを示します。
  • *)>これは、デフォルト ケースとして知られる特殊なケースです。前のパターンのどれも一致しない場合は、EXPRESSION>STATEMENTS>*)>ブロックが実行されます。
  • esac>キーワードは case ステートメントの終わりを示します。
  • 一致するパターンがない場合、戻りステータスは 0 になります。それ以外の場合、戻りステータスは、一致したパターンのケースの実行された本体の終了ステータスです。
  • C がデフォルト ステートメントにデフォルト キーワードを提供するのと同様に、Bash case ステートメントでも、ワイルドカード アスタリスク記号 (*) を使用して、最終パターン ケースを定義してデフォルト ケースを定義できます。

例 1: 各オプションの説明を出力する

この例では、スクリプトを使用してユーザーが部門を選択し、echo コマンドを使用して入力に対応する説明を表示します。このスクリプトでは、DEPARTMENT 変数をコンピューター サイエンスとして割り当てています。これにより、最初のパターンのケースの本体が実行されます。



以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。



#!/bin/bash DEPARTMENT='Computer Science' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac>

3. 各行について以下に説明します。

文字列に長い
  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • DEPARTMENT 変数をコンピューター サイエンスとして初期化しました。
  • ここでは case ステートメントを使用しています。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

406

例 2: 複数のパターンを使用する場合

各節では、複数のパターンのケースを使用できます。式が少なくとも 1 つのパターン ケースと一致する場合、句の本体が実行されます。このスクリプトでは、DEPARTMENT 変数に Electronics and Communication を割り当てています。 3 番目のパターンのケースには、パイプ ( | ) 演算子で区切られた 2 つの値があります。これにより、3 番目のパターンのケースの本体が実行されます。

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash DEPARTMENT='Electronics and Communication' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac>

3. 各行については以下で説明しています。

  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • DEPARTMENT 変数を Electronics and Communication として初期化しました。
  • ここでは case ステートメントを使用しています。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

Javaのサンプルコード
chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

407 例 3: for ループ

このスクリプトでは、クラスの 3 人の生徒の部門を配列 DEPARTMENT に割り当てています。つまり、DEPARTMENT 変数に記述されている複数の式を処理します。複数の式を反復するには、for ループを使用できます。

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash DEPARTMENT=('Electronics and Communication' 'Computer Science' 'Information Technology') for value in '${DEPARTMENT[@]}' do case $value in 'Computer Science') echo -n 'Computer Science ' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering ' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication ' ;; *) echo -n 'Invalid ' ;; esac done>

3. 各行について以下に説明します。

  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • 配列 DEPARTMENT を 3 つの文字列リテラルで初期化しました。
  • ここで、for ループを使用して、要素の配列を反復処理します。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

408

例 4: ユーザーに「はい」または「いいえ」を入力するよう求める

以下の手順に従ってください。

ピート・デビッドソン

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash echo -n 'Are you a student? [yes or no]: ' read response case $response in 'Y' | 'y' | 'YES' | 'Yes' | 'yes') echo -n 'Yes, I am a student.' ;; 'N' | 'n' | 'No' | 'NO' | 'no' | 'nO') echo -n 'No, I am not a student.'; ;; *) echo -n 'Invalid input' ;; esac>

3. 各行について以下で説明します。

  • スクリプトの最初の行はシバン (#!) で始まります。
    • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • ユーザーには「学生ですか?」というメッセージが表示されます。 [はい、もしくは、いいえ]。
  • ここで、ユーザーはキーボードを介して応答を返します。
  • 応答の出力は、case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. 以下のコマンドを使用してスクリプトを実行します。

./department.sh>

出力:

409

例 5: プロセスにシグナルを送信する

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

signals.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash if [ $# -lt 2 ] then echo 'Usage : 

ケースステートメント bash スクリプトでは、複数の選択肢に対して決定を下す必要がある場合に使用されます。言い換えれば、式が複数の値を持つ可能性がある場合に便利です。この方法は、スクリプト内の複数の if ステートメントの代替として見ることができます。 Case ステートメントは、コードの可読性が向上し、保守が容易であるため、if ステートメントよりも優れています。 Bash スクリプトの Case ステートメントは、C 言語の Case ステートメントと非常に似ています。ただし、C とは異なり、Bash Case ステートメントは一致が発生するとすぐに検索の続行を停止します。簡単に言えば、パターンの検索をさらに停止するために C で使用することが必須である Break ステートメントは必要ありません。

case ステートメントの基本的な構文を以下に示します。

構文:

case EXPRESSION in Pattern_Case_1) STATEMENTS ;; Pattern_Case_1) STATEMENTS ;; Pattern_Case_N) STATEMENTS ;; *) STATEMENTS ;; esac>

case ステートメントがどのように機能するかは次のとおりです。

  • EXPRESSION>一致を見つけるためにさまざまなパターン (ケース) に対して評価される変数または値です。
  • case ステートメントはキーワードで始まりますcase>続いてEXPRESSION>評価されること。
  • 各ケースは次のように定義されます。Pattern_Case>と比較される特定の値またはパターンを表すEXPRESSION>
  • それぞれの後にPattern_Case>、次の場合に実行されるステートメントがあります。EXPRESSION>特定のものと一致しますPattern_Case>。これらのステートメントは次のように表されます。STATEMENTS>
  • ;;>それぞれの終わりにSTATEMENTS>block は case ブロックの終わりを示します。
  • *)>これは、デフォルト ケースとして知られる特殊なケースです。前のパターンのどれも一致しない場合は、EXPRESSION>STATEMENTS>*)>ブロックが実行されます。
  • esac>キーワードは case ステートメントの終わりを示します。
  • 一致するパターンがない場合、戻りステータスは 0 になります。それ以外の場合、戻りステータスは、一致したパターンのケースの実行された本体の終了ステータスです。
  • C がデフォルト ステートメントにデフォルト キーワードを提供するのと同様に、Bash case ステートメントでも、ワイルドカード アスタリスク記号 (*) を使用して、最終パターン ケースを定義してデフォルト ケースを定義できます。

例 1: 各オプションの説明を出力する

この例では、スクリプトを使用してユーザーが部門を選択し、echo コマンドを使用して入力に対応する説明を表示します。このスクリプトでは、DEPARTMENT 変数をコンピューター サイエンスとして割り当てています。これにより、最初のパターンのケースの本体が実行されます。

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash DEPARTMENT='Computer Science' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac>

3. 各行について以下に説明します。

  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • DEPARTMENT 変数をコンピューター サイエンスとして初期化しました。
  • ここでは case ステートメントを使用しています。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

406

例 2: 複数のパターンを使用する場合

各節では、複数のパターンのケースを使用できます。式が少なくとも 1 つのパターン ケースと一致する場合、句の本体が実行されます。このスクリプトでは、DEPARTMENT 変数に Electronics and Communication を割り当てています。 3 番目のパターンのケースには、パイプ ( | ) 演算子で区切られた 2 つの値があります。これにより、3 番目のパターンのケースの本体が実行されます。

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash DEPARTMENT='Electronics and Communication' echo -n 'Your DEPARTMENT is ' case $DEPARTMENT in 'Computer Science') echo -n 'Computer Science' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication' ;; *) echo -n 'Invalid' ;; esac>

3. 各行については以下で説明しています。

  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • DEPARTMENT 変数を Electronics and Communication として初期化しました。
  • ここでは case ステートメントを使用しています。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

407 例 3: for ループ

このスクリプトでは、クラスの 3 人の生徒の部門を配列 DEPARTMENT に割り当てています。つまり、DEPARTMENT 変数に記述されている複数の式を処理します。複数の式を反復するには、for ループを使用できます。

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash DEPARTMENT=('Electronics and Communication' 'Computer Science' 'Information Technology') for value in '${DEPARTMENT[@]}' do case $value in 'Computer Science') echo -n 'Computer Science ' ;; 'Electrical and Electronics Engineering' | 'Electrical Engineering') echo -n 'Electrical and Electronics Engineering or Electrical Engineering ' ;; 'Information Technology' | 'Electronics and Communication') echo -n 'Information Technology or Electronics and Communication ' ;; *) echo -n 'Invalid ' ;; esac done>

3. 各行について以下に説明します。

  • スクリプトの最初の行はシバン (#!) で始まります。
  • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • 配列 DEPARTMENT を 3 つの文字列リテラルで初期化しました。
  • ここで、for ループを使用して、要素の配列を反復処理します。
  • 各式は case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. スクリプトを実行します。

./department.sh>

出力:

408

例 4: ユーザーに「はい」または「いいえ」を入力するよう求める

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

department.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash echo -n 'Are you a student? [yes or no]: ' read response case $response in 'Y' | 'y' | 'YES' | 'Yes' | 'yes') echo -n 'Yes, I am a student.' ;; 'N' | 'n' | 'No' | 'NO' | 'no' | 'nO') echo -n 'No, I am not a student.'; ;; *) echo -n 'Invalid input' ;; esac>

3. 各行について以下で説明します。

  • スクリプトの最初の行はシバン (#!) で始まります。
    • これは、スクリプトを解析するために特定のインタープリターを使用するようにオペレーティング システムに指示します。
  • ユーザーには「学生ですか?」というメッセージが表示されます。 [はい、もしくは、いいえ]。
  • ここで、ユーザーはキーボードを介して応答を返します。
  • 応答の出力は、case ステートメントを通じて処理されます。
  • 最後の行 esac は、case ステートメントを終了するために使用されています。

4. スクリプトを保存し、実行可能にします。

chmod +x department.sh>

5. 以下のコマンドを使用してスクリプトを実行します。

./department.sh>

出力:

409

例 5: プロセスにシグナルを送信する

以下の手順に従ってください。

1. ターミナルを開き (Ctrl + Alt + T)、スクリプトを作成します。

signals.sh>

2. 次のステートメントをスクリプトに追加します。

#!/bin/bash if [ $# -lt 2 ] then echo 'Usage : $0 Signalnumber PID' exit fi # Case statement # Signal number (expression) case '$1' in 1) echo 'Sending SIGHUP signal.....' kill -SIGHUP $2 ;; 2) echo 'Sending SIGINT signal.....' kill -SIGINT $2 ;; 3) echo 'Sending SIGQUIT signal.....' kill -SIGQUIT $2 ;; 4) echo 'Sending SIGKILL signals.....' kill -SIGKILL $2 ;; *) echo 'Signal number $1 has not been processed' ;; esac>

3. 各行について以下で説明します。

  • $1 はシグナル番号、$2 はプロセス ID です。
  • 指定されたプロセス ID にシグナルを渡す、または送信するには、kill コマンドを使用します。
  • これにより、sleep コマンドが数秒間実行されます。
  • オプションの最後の比較の本体 *) は、デフォルトの場合に実行されます。

4. スクリプトを保存します。

5. 以下のコマンドを使用してスクリプトを実行します。

./signals.sh>

出力:

$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed>


Signalnumber PID' exit fi # Case statement # Signal number (expression) case '' in 1) echo 'Sending SIGHUP signal.....' kill -SIGHUP ;; 2) echo 'Sending SIGINT signal.....' kill -SIGINT ;; 3) echo 'Sending SIGQUIT signal.....' kill -SIGQUIT ;; 4) echo 'Sending SIGKILL signals.....' kill -SIGKILL ;; *) echo 'Signal number has not been processed' ;; esac>

3. 各行について以下で説明します。

  • はシグナル番号、 はプロセス ID です。
  • 指定されたプロセス ID にシグナルを渡す、または送信するには、kill コマンドを使用します。
  • これにより、sleep コマンドが数秒間実行されます。
  • オプションの最後の比較の本体 *) は、デフォルトの場合に実行されます。

4. スクリプトを保存します。

おっと

5. 以下のコマンドを使用してスクリプトを実行します。

./signals.sh>

出力:

$ sleep 10000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signals.sh 9 31231 Sending SIGKILL signal $ sleep 10000 Killed>