Answers:
所述variable=$(...)构建体将采取的任何命令是在标准输出$(...)并把它分配给variable。因此,要以所需variable的方式进行分配,必须将值发送到标准输出。使用以下echo命令可以轻松完成此操作:
color_code=$(case "$COLOR" in
  red)    echo 1;;
  yellow) echo 2;;
  green)  echo 3;;
  blue)   echo 4;;
esac)这将适用于bash所有其他POSIX shell。
根据POSIX标准,case语句中的左括号是可选的,并且以下内容也适用:
color_code=$(case "$COLOR" in
  (red)    echo 1;;
  (yellow) echo 2;;
  (green)  echo 3;;
  (blue)   echo 4;;
esac)正如Gilles在评论中指出的那样,并不是所有的shell都接受以下两种形式的结合使用$(...):有关令人印象深刻的详细兼容性表,请参见“ $()”命令替换与嵌入式“)”。
(为可选项。我想这可能有助于避免让)被误解为闭合)的$(...)表达。
                    (是可选的:不带或不带它们的代码都一样。我之所以放弃它们,只是因为无论好坏,这都是传统。提出的解决方案的关键部分是的使用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)但这不是很惯用。Shell语言适用于简单命令的简单组合。大命令的替换很尴尬。命令替换将创建一个子shell,该子shell比直接方法要慢:
case "$COLOR" in
  red)    color_code=1;;
  yellow) color_code=2;;
  green)  color_code=3;;
  blue)   color_code=4;;
esac两种方法之间的主要语义差异是$(…)创建一个子外壳,因此在内部执行的任何赋值,退出,重定向等在外部均无效。
(的。否则就可以了。