在许多语言中,可以将 case/switch 语句的结果分配给变量,而不是在 case 语句中多次重复变量分配。是否可以在 Bash shell 中执行类似的操作?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(或者,顺便说一句,在任何其他 shell 中?)
答案1
该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 都接受这两种形式与$(...)
: 的组合,有关令人印象深刻的详细兼容性表,请参阅“$( )”命令替换与嵌入的“)”。
答案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)
但这不是很惯用。 shell 语言面向简单命令的简单组合。这种大的命令替换很尴尬。命令替换创建一个子 shell,它比直接方法慢:
case "$COLOR" in
red) color_code=1;;
yellow) color_code=2;;
green) color_code=3;;
blue) color_code=4;;
esac
两种方法之间的主要语义区别在于$(…)
创建一个子 shell,因此在内部执行的任何赋值、退出、重定向等对外部没有影响。