GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプティング–ケースステートメント

前回の記事では、bashで条件ステートメントを操作して条件を評価し、その結果に基づいて決定を下す方法を見てきました。同様に、この記事では、caseステートメントの使用方法を学習します。 条件の評価にも使用されるBashスクリプトで。 if..elif..elseの長いリストを作成する代わりに、Bashのcaseステートメントを使用できます。 声明。条件文についてわからない場合は、このトピックに関する詳細な記事があります。この記事を読む前に、それを確認することをお勧めします。

  • Bashスクリプティング–条件付きステートメント

caseステートメントの構文

bashのcaseステートメントの構文を以下に示します。

パターンの
case expression in
  pattern1) STATEMENTS ;;
  pattern2) STATEMENTS ;;
  Pattern3 | Pattern4 | pattern5) STATEMENTS ;;
  pattern-N) STATEMENTS ;;
  *) STATEMENTS ;;
esac

説明:

  1. キーワード"case" および"esac" ケースステートメントの開始と終了をマークします。
  2. キーワードcaseの後には、 "expression"を続ける必要があります 。この式が評価され、出力がパターンのリストに対して検索されます。
  3. 式の後、 "in" "value in patterns"を指すキーワードを記述する必要があります
  4. 必要な数のパターンを作成できます。各パターンはifと考えることができます およびelif 条件文の節。式から評価された値がパターンと一致する場合、そのパターンはコードのブロックを実行します。残りのパターンはスキップされます。
  5. パターン内の各ステートメントは、ダブルセミコロンで終了する必要があります (;;
  6. ifステートメントのelse句と同様に、caseステートメントにはアスタリスクと呼ばれるデフォルトのパターンがあります。 ( * )どのパターンも一致しない場合、コードのブロックを実行します。

例1-caseステートメントを使用した電卓

この例では、caseステートメントを使用して簡単な計算機を作成しました。このコードを実行するとどうなるかを説明しましょう。

  1. ユーザーは2つの数値を入力するように求められ、変数 "X"に格納されます。 および"Y"
  2. ユーザーは、演算のタイプ(加算、減算、乗算、除算)を入力するように求められ、変数 "OPERATOR"に格納されます。 。
  3. caseステートメントの場合変数"OPERATOR" 評価され、さまざまなパターン + - x/% )さまざまな操作用に作成されます。
  4. パターンが一致する場合、特定のパターンはそのステートメントを実行し、caseステートメント内の他のすべてのパターンをスキップします。
  5. 目的の算術演算子以外の値を入力しようとすると、デフォルトのパターン * )ステートメントを実行します。
#!/usr/bin/env bash

read -p "Enter the first number(X)  :  " X
read -p "Enter the second number(Y) :  " Y
read -p "
Addition => +
Subtract => -
Multiply => x
Division => /
Reminder => %

Choose any one operator   :  " OPERATOR
case "$OPERATOR" in
 +)
   echo -e "\nAddition of X and Y is $(( X + Y ))" ;;
 -)
   echo -e "\nSubtraction of X and Y is $(( X - Y ))" ;;
 x)
   echo -e "\nMultiply X and Y is $(( X * Y ))" ;;
 /)
   echo -e "\nDivision of X and Y is $(( X / Y ))" ;;
 %)
   echo -e "\nReminder of X and Y is $(( X % Y ))" ;;
 *)
   echo -e "\n[ERROR] You have chosen an operator that is not in the list.
You can choose either(+, -, x, /, %) operator from the list.
Rerun the program again."
esac

下の画像を見てください。コードを送信して、「追加演算子」を選択しています。 。

同じコードを再度実行していますが、今回はデフォルトのパターン(*)を作成するランダムな値を指定します )ステートメントを実行します。

例2-単一の句で複数のパターンを作成する

前の例では、算術演算子ごとに異なるパターンを作成しました。同じ句に複数のパターンを作成することも可能であり、パターンのいずれかが一致すると、特定のステートメントが実行されます。構文は同じですが、パイプを追加します シンボル( | )そして、以下のように同じ行に異なるパターンを追加します。

パターン1の
case expression in
   Pattern1 | Pattern2 | pattern3) 
   STATEMENTS ;;
   *)
   STATEMENTS ;;
esac

以下の例では、ユーザーは入力として年を入力し、IPLデータからオレンジ色のキャップの詳細を取得します。 2015年、2017年、2019年に同じプレーヤーがオレンジ色のキャップを獲得したので、同じ条項のパターンとして別の年を作成しました。

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

例3-caseステートメントでのパターンマッチング

パターンマッチング caseステートメントで使用できます。前のセクションと同じ例を使用していますが、パターンを追加しています (20[2-9][2-9]) ここで、ユーザーが2021年より前の年を入力すると、「シリーズはまだ発生していません」というメッセージが出力されます。

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 20[2-9][2-9])
   echo -e "\nSeries is yet to happen for the year $CAP" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

例4-ユーザーの確認を取得する

プログラムの次のステップに進むために、ユーザーに確認の提供を求める場合があります。このユースケースでは、caseステートメントを使用することをお勧めします。

前の例では、パターンは1行に、ステートメントは別の行に書き込まれますが、以下に示すように、パターンとステートメントを1行に書き込むこともできます。

read -p "Input file is received in CSV format, Please confirm to load the data into production database  : " CONFIRM
case "$CONFIRM" in
 [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;;
 [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..\n Exiting the script.." ;;
 *) echo -e "[ERROR] = Wrong Input, Exiting the script.."
esac

例5-リターンコードを含むcaseステートメント

以前に実行したコマンドの戻りコードをキャプチャし、caseステートメントを使用していくつかのアクションを実行するロジックを記述できます。 zenityを使用してユーザーからユーザー名とパスワードを受け入れるGUIダイアログボックスを作成しています 。ユーザーがユーザー名とパスワードを正常に送信すると、zenityはリターンコードをゼロとしてスローし、それに基づいて新しいユーザーを追加するロジックを追加しました。ゼロ以外の場合、エラーメッセージがスローされます。

INFO=$(zenity --password --username)
case $? in
 0)
   USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }')
   PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }')
   useradd -m -p "${PASSWORD}" "${USERNAME}"
   ;;
 *)
   echo "[ERROR] - User not added."
esac

[キャンセル]を押しました ダイアログボックスのボタンが表示されたため、デフォルトのパターン(*)を使用してエラーが発生しました 。

推奨される読み物:

  • LinuxおよびUnixでZenityを使用してBashスクリプトでGUIダイアログボックスを作成する方法

参照スクリプト

ケースステートメントをより快適にするために、ケースステートメントを使用して記述された既存のコードを確認できます。開始するのに適した場所は、/etc/init.dの下にある起動スクリプトを読むことです。 ディレクトリ。たとえば、マシンにvirtualboxをインストールしていて、/etc/init.dの下にスタートアップファイルがあります。 ディレクトリ。ケースステートメントを使用して記述されたコードのセクションがあり、ケースステートメントがどのように機能するかについての良いアイデアを提供します。

$ cd /etc/init.d/
$ cat bluetooth

結論

この記事では、Bashのcaseステートメントとは何かとそれを使用するさまざまな方法を見てきました。条件文とcase文はどちらも同じ目的を果たします。どの方法がユースケースに適しているかをよりよく理解する必要があります。 getoptを使用してヘルプ関数を作成する必要がある場合にも、Caseステートメントが使用されます。 およびgetopts プログラム。スクリプトを作成し、ここで示した例の練習を開始して、caseステートメントについて詳しく理解します。

Bashスクリプトガイド:

  • Bashスクリプティング–条件付きステートメント
  • Bashスクリプティング–文字列操作
  • Bashスクリプティング–例を使用して説明されたPrintfコマンド
  • Bashスクリプティング–例を使用して説明されたインデックス付き配列
  • Bashスクリプティング–例を使用して説明された連想配列
  • Bashスクリプティング–例で説明されているForループ
  • Bashスクリプティング–ループの説明中およびループまで
  • 例を使用して説明されたBashリダイレクト
  • Bashスクリプティング–例で説明されている変数
  • Bashスクリプティング–例で説明されている関数
  • Linuxの例で説明されているBashEchoコマンド
  • 初心者向けのBashヒアドキュメントチュートリアル

Linux
  1. シェルスクリプトのステートメントブロックメカニズム?

  2. Bashでのケースステートメントの使用

  3. bashにgotoステートメントはありますか?

  1. Bashスクリプト(I)

  2. 例を含む Bash If-Else ステートメント

  3. 5 Bash Case ステートメントの例

  1. Bashcaseステートメントの構文と例

  2. Bashの続行:ループを再開する方法

  3. Bash/sh 'if else' ステートメント