回答:
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がコメントで指摘しているように、すべてのシェルが両方の形式を組み合わせて受け入れるわけではありません。$(...)
互換性の印象的な詳細表については、「$()」コマンド置換と埋め込み「)」を参照してください。
(
がオプションとして記載されていました。表現の)
締めくくりとして誤解されるのを防ぐのに役立つかもしれないと思い)
ました$(...)
。
(
はオプションです:コードはそれらがなくても同じように機能します。良くも悪くも、それは伝統だからです。提案されたソリューションの重要な部分は、の使用ですecho
。
(
を許可していませんでしたが、コマンド置換でを使用する場合case
、一部のシェルは開始を要求しました。現代の砲弾はどちらの方法でも問題ありません。in-ulm.de/~mascheck/various/cmd-subst(
case
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つのアプローチの主な意味上の違い$(…)
は、サブシェルを作成することです。そのため、内部で実行される割り当て、終了、リダイレクトなどは外部には影響しません。
(
sがあります。それ以外の場合は問題ありません。