案例陈述之外的变量分配


8

在许多语言中,可以将case / switch语句的结果分配给变量,而不是在case语句中多次重复变量分配。是否可以在Bash shell中执行类似的操作?

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

(或者,顺便说一句,在其他任何外壳中?)


您有额外(的。否则就可以了。
HalosGhost

Answers:


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 shell。

可选的左括号

根据POSIX标准,case语句中的左括号是可选的,并且以下内容也适用:

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

正如Gilles在评论中指出的那样,并不是所有的shell都接受以下两种形式的结合使用$(...):有关令人印象深刻的详细兼容性表,请参见“ $()”命令替换与嵌入式“)”


我检查过的一页(我不记得它在哪里)列出了该开口(为可选项。我想这可能有助于避免让)被误解为闭合)$(...)表达。
iconoclast 2014年

@iconoclast是的。开头(是可选的:不带或不带它们的代码都一样。我之所以放弃它们,只是因为无论好坏,这都是传统。提出的解决方案的关键部分是的使用echo
2014年

1
@iconoclast较旧的(POSIX之前的)shell不允许打开模式,但是某些shell 允许并且要求在命令替换中使用时打开(case模式。无论哪种方式,现代壳都很好。参见in-ulm.de/~mascheck/various/cmd-subst(case
别再邪恶了'

1
@吉尔斯感谢您提供的信息。与往常一样,您的知识深度令人印象深刻。
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)

但这不是很惯用。Shell语言适用于简单命令的简单组合。大命令的替换很尴尬。命令替换将创建一个子shell,该子shell比直接方法要慢:

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

两种方法之间的主要语义差异是$(…)创建一个子外壳,因此在内部执行的任何赋值,退出,重定向等在外部均无效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.