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は、チェックする文字列を指定するだけで、その下のオプションは、一致するものが見つかるたびにコマンドを実行します。
次に、オプションの指定を開始します。 ""
があったことを忘れないでください 、square
、circle
、triangle
、および*
最初のスクリプトのオプションとして。
ケースステートメントは上から下にチェックされ、最初の一致でのみ実行されます。次の例を考えてみましょう:
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の基本を最初から学ぶことができます。
質問がありますか、または何かが正しく機能していませんか?以下にコメントを残してください。できる限り返信させていただきます。