如果您编写 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
仅用作虚拟变量,以允许默认参数扩展生成命令替换的输出。