如果您编写 Bashcase
语句,是否可以在不将其显式分配给变量的情况下获取当前匹配项?
考虑
case $(some subshell command sequence) in
one) stuff ;;
*) stuff "$case_match";;
esac
Run Code Online (Sandbox Code Playgroud)
我知道我可以执行以下操作,但希望更简洁。
case_match=$(some subshell command sequence)
case "$case_match" in
...
Run Code Online (Sandbox Code Playgroud)
是否有一个特殊的变量代表$case_match
?
以下来自@Hauke Laging 的评论是另一个人为的例子。你可以这样做:
today=$(date '+%A')
case "$today" in
*) echo "It's $today" ;;
esac
Run Code Online (Sandbox Code Playgroud)
但是这样做会很好 - 问题问这是否可能(但它不是):
case $(date '+%A') in
*) echo "It's $case_match" ;;
esac
Run Code Online (Sandbox Code Playgroud)
(case_match
躲避我们的黄金变量在哪里)
不。
随着zsh -o extendedglob
但是你可以这样做:
case $(cmd) in
((#m)*) printf '%s\n' "Match: $MATCH"
esac
Run Code Online (Sandbox Code Playgroud)
(#m)
是启用的通配标志$MATCH
。它在诸如${var//(#m)?/<$MATCH>}
.
或者:
case $(cmd) in
((#b)(???)(*)) printf '%s\n' "First 3 chars: $match[1], rest: $match[2]"
esac
Run Code Online (Sandbox Code Playgroud)
(#b)
用于启用反向引用。
或者(不需要extendedglob
):
case ${output::=$(cmd)} in
(*) printf '%s\n' "Output: $output"
esac
Run Code Online (Sandbox Code Playgroud)