ケースステートメント外の変数の割り当て


8

多くの言語では、caseステートメント内で変数の割り当てを何度も繰り返すのではなく、case / switchステートメントの結果を変数に割り当てることができます。Bashシェルでこのようなことを行うことは可能ですか?

color_code=$(case "$COLOR" in
  (red)    1;;
  (yellow) 2;;
  (green)  3;;
  (blue)   4;;
esac)

(または、余談ですが、他のシェルでは?)


余分な(sがあります。それ以外の場合は問題ありません。
HalosGhost 14

回答:


6

variable=$(...)構築物は、中にあるものは何でも、コマンドの標準出力がかかります$(...)し、それを割り当てますvariable。したがって、variable希望どおりに割り当てるには、値を標準出力に送信する必要があります。これはecho次のコマンドで簡単に実行できます。

color_code=$(case "$COLOR" in
  red)    echo 1;;
  yellow) echo 2;;
  green)  echo 3;;
  blue)   echo 4;;
esac)

これはbash、他のすべてのPOSIXシェルと同様に機能します。

オプションの左括弧

POSIX規格によれば、caseステートメントの左括弧はオプションであり、以下も機能します。

color_code=$(case "$COLOR" in
  (red)    echo 1;;
  (yellow) echo 2;;
  (green)  echo 3;;
  (blue)   echo 4;;
esac)

Gillesがコメントで指摘しているように、すべてのシェルが両方の形式を組み合わせて受け入れるわけではありません。$(...)互換性の印象的な詳細表については、「$()」コマンド置換と埋め込み「)」を参照してください。


確認した1つのページ(どこにあったかは覚えていません)に、オープニング(がオプションとして記載されていました。表現の)締めくくりとして誤解されるのを防ぐのに役立つかもしれないと思い)ました$(...)
iconoclast 14

@iconoclastはい。開始(はオプションです:コードはそれらがなくても同じように機能します。良くも悪くも、それは伝統だからです。提案されたソリューションの重要な部分は、の使用ですecho
John1024 2014

1
@iconoclast古い(POSIX以前の)シェルはパターンの開始(を許可していませんでしたが、コマンド置換でを使用する場合case、一部のシェルは開始を要求しました。現代の砲弾はどちらの方法でも問題ありません。in-ulm.de/~mascheck/various/cmd-subst(case
Gilles 'SO- stop being evil'を

1
@ギレスその情報をありがとう。あなたの知識の深さは、いつものように印象的です。
John1024 2014

2

color_code=$(…)コマンドの出力を変数color_codeに割り当て、最後の改行を削除します。したがって、出力を生成する必要があります。記述したコードは1、コマンドとして実行しようとします。

このイディオムを使用できます。サポートされている値がないcolor_code場合$COLORは空になることに注意してください。

color_code=$(case "$COLOR" in
  (red)    echo 1;;
  (yellow) echo 2;;
  (green)  echo 3;;
  (blue)   echo 4;;
esac)

しかし、それはあまり慣用的ではありません。シェル言語は、単純なコマンドの単純な組み合わせを対象としています。この大きなコマンドの置換は厄介です。コマンド置換によりサブシェルが作成されますが、これは単純な方法よりも低速です。

case "$COLOR" in
  red)    color_code=1;;
  yellow) color_code=2;;
  green)  color_code=3;;
  blue)   color_code=4;;
esac

2つのアプローチの主な意味上の違い$(…)は、サブシェルを作成することです。そのため、内部で実行される割り当て、終了、リダイレクトなどは外部には影響しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.