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

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

Bashスクリプトを作成するときは、文字列を変数と照合してから、指定された内容に基づいて何かを実行するのが一般的です。

次のスクリプトについて考えてみます。ユーザーが指定した最初の引数をチェックし、与えられた内容に応じてさまざまなことを行います。

#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
	echo "No shape was specified."

elif [[ "${1}" == "square" ]]; then
	echo "You specified 'square'."

elif [[ "${1}" == "circle" ]]; then
	echo "You specified 'circle'."

elif [[ "${1}" == "triangle" ]]; then
	"You specified 'triangle'." 
    
else
	echo "Unknown shape '${1}'."
    exit 1

fi

これは、機能はありませんが、既知の形状をユーザーに繰り返すことができる単純なタスクを示しています。形状が不明な場合は、エラーメッセージを表示します。

これですべてがうまくてダンディであり、それはすべて期待どおりに機能します。しかし、何行かかったかを見てください。ユーザーがelifを通過するすべてのオプションをどのように処理する必要があるかをご覧ください ステートメント?

現在、このプログラムのイメージングにはさらに多くのオプション、たとえば20があります。現在のアプローチでは、ifを記述します。 20個のelifを含むステートメント その中のセクション。

ええ、あなたはおそらくそれをほとんど読むことができるでしょう。しかし、それは不格好で、スペースを取りすぎます。そして最も重要なのは、より良い代替手段があることです。

Bashでのcaseステートメントの紹介

ここでcaseステートメントが登場します。これにより、ifと比較して、チェックに必要なコードの行数を大幅に減らすことができます。 ステートメント。

同じif 提供されたオプションをチェックするために使用したステートメントは、ケース1の中で次のように書き直すことができます。

#!/usr/bin/env bash
case "${1}" in
	"")         echo "No option was specified."; exit 1 ;;
    square)     echo "You specified 'square'." ;;
    circle)     echo "You specified 'circle'." ;;
    triangle)   echo "You specified 'triangle'." ;;
    *)          echo "Unknown shape '${1}'."; exit 1 ;;
esac

それがどれほどシンプルで整理されているか見てください。これは、ifの12行のコードです。 ステートメント、およびcaseでは7つのみ 1。そして、許可するオプションが多いほど、その違いはさらに大きくなります。

そして、それがcase ステートメントが輝いています。どちらも完全に判読できますが、特に少量の場合は、case ステートメントは、長期的にすべてをよりクリーンで保守しやすくするだけです。

Bashでcaseステートメントを作成するにはどうすればよいですか?

ケースステートメントは、少し練習するだけで非常に簡単に理解できます。それで、これが起こっていることの基本です:

最初に表示された行は、case ${1} inでした。 。 ${1} チェックされる文字列を示します。これがスクリプトに渡される最初の引数です。

たとえば、次のcaseステートメントについて考えてみます。

case linux in
    windows)    echo "windows" ;;
    macos)      echo "macos" ;;
    linux)      echo "linux" ;;
esac

この例では、常にecho "linux"を実行します 。 case *string* in partは、チェックする文字列を指定するだけで、その下のオプションは、一致するものが見つかるたびにコマンドを実行します。

次に、オプションの指定を開始します。 ""があったことを忘れないでください 、squarecircletriangle 、および* 最初のスクリプトのオプションとして。

ケースステートメントは上から下にチェックされ、最初の一致でのみ実行されます。次の例を考えてみましょう:

case linux in
	linux)      echo "linux" ;;
    windows)    echo "windows" ;;
    linux)      echo "linux 2.0" ;;
esac

ここで実行されるコマンドは、echo "linux"のみです。 。すでに見つかった一致があったため、2番目の一致はスキップされます。

caseステートメントの各行もで終わる必要があります ;; 。これは、オプションのコマンドリストの終わりを意味し、それ以上のコマンドを処理する必要がないことを意味します。

caseステートメントの引数リスト(linux) およびwindows) パーツはワイルドカードもサポートします。したがって、linu*)のようなものを入力します 両方のlinuxに一致します およびlinus

最後に、caseステートメントをで終了します esac 。これにより、doneなど、処理するすべてのものがリストされたことがわかります。 forで行います またはwhile ループ。

ケースステートメントを終了するためのキーワードを覚えておくには、esacということを覚えておいてください。 caseです 後方に。 実際のケースステートメント-引数チェック

私自身のプログラミングでcaseステートメントを頻繁に使用するのは、引数リストと照合することです。

次のオプションをプログラムに提供することを許可するとします。

  • --vertical
  • --add-txt
  • --replace
  • --verify

caseステートメントでこれを確認するには、次のようなものを使用できます:

while [[ "${1}" != "" ]]; do
	case "${1}" in
    	--vertical)    verticle="true" ;;
        --add-txt)     add_txt="true" ;;
        --replace)     replace="true" ;;
        --verify)      verify="true" ;;
    esac
    
    shift 1
done

これはwhileを実行します ${1}の間にループします (スクリプトに与えられた最初の引数)は空ではありません。次に、引数リストと照合し、提供されたオプションが設定されている場合は変数を割り当てます。

caseステートメントと照合した後、shift 1を実行します。 、${2}の値が発生します (スクリプトに提供される2番目の引数)${1}の値に移動します 、新しい${1}に対してこれを繰り返します (以前は${2}でした )${1}まで 何も設定されていません。

そして、あなたは行き​​ます!ケースステートメントを使用するための基本はこれですべてです。

まとめ

Caseステートメントは、コードをより迅速かつ効率的に作成するのに役立ちます。また、長期的に見やすく、保守しやすくするのにも役立ちます。

Bashを初めて使用する場合は、Bash初心者シリーズでBashの基本を最初から学ぶことができます。

質問がありますか、または何かが正しく機能していませんか?以下にコメントを残してください。できる限り返信させていただきます。


Linux
  1. 自動化のためのBashの使用

  2. バンをエコーする方法!?

  3. BashスクリプトでのLinuxスリープコマンドの使用

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

  2. Bash の配列が見つかりません

  3. Bashスクリプトで1行ずつ読む

  1. .bashrcでエクスポートを使用しますか?

  2. Bash初心者シリーズ#9:Bashでの関数の使用

  3. コマンドの出力をBashを使用して列ごとに分割しますか?