case 语句外的变量赋值

case 语句外的变量赋值

在许多语言中,可以将 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,因此在内部执行的任何赋值、退出、重定向等对外部没有影响。

相关内容