是否有包含 case 语句匹配的特殊变量

是否有包含 case 语句匹配的特殊变量

如果您编写 Bashcase语句,是否可以在不显式将其分配给变量的情况下获取当前匹配项?

考虑

case $(some subshell command sequence) in
  one) stuff ;;
  *) stuff "$case_match";;
esac

我知道我可以执行以下操作,但想要更简洁。

case_match=$(some subshell command sequence)
case "$case_match" in
...

有没有一个特殊的变量来表示$case_match


以下评论来自@豪克·拉格另一个人为的例子。你可以这样做:

today=$(date '+%A')
case "$today" in
  *) echo "It's $today" ;;
esac

但这样做会很好 - 问题询问这是否可能(但事实并非如此):

case $(date '+%A') in
  *) echo "It's $case_match" ;;
esac

case_match我们忽略的黄金变量在哪里)

答案1

不。

但是zsh -o extendedglob你可以这样做:

case $(cmd) in
  ((#m)*) printf '%s\n' "Match: $MATCH"
esac

(#m)是个通配标志启用$MATCH。它在诸如 之类的事情上更有用${var//(#m)?/<$MATCH>}

或者:

case $(cmd) in
  ((#b)(???)(*)) printf '%s\n' "First 3 chars: $match[1], rest: $match[2]"
esac

(#b)用于启用反向引用

或者(不需要extendedglob):

case ${output::=$(cmd)} in
  (*) printf '%s\n' "Output: $output"
esac

答案2

您可以通过一些技巧来实现,但您需要确保有一个未​​设置的可用变量。例如:

unset foo  # Make sure foo is unset, or at least set to the empty string
case ${foo:-$(date +%m)} in
   1) echo "Jan" ;;
   2) echo "Feb" ;;
 # ...
  11) echo "Nov" ;;
  12) echo "Dec" ;;
esac

此处,foo仅用作虚拟变量,以允许默认参数扩展生成命令替换的输出。

相关内容