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
两种方法之间的主要语义差异是$(…)
创建一个子外壳,因此在内部执行的任何赋值,退出,重定向等在外部均无效。
(
的。否则就可以了。