Bash 문을 작성하는 경우 case
변수에 명시적으로 할당하지 않고 현재 일치 항목을 얻을 수 있습니까?
고려하다
case $(some subshell command sequence) in
one) stuff ;;
*) stuff "$case_match";;
esac
다음을 수행할 수 있다는 것을 알고 있지만 더 간결하게 하고 싶습니다.
case_match=$(some subshell command sequence)
case "$case_match" in
...
이것을 나타내는 특별한 변수가 있나요 $case_match
?
다음 댓글의 출처는 다음과 같습니다.@hawkerlag또 다른 인위적인 예입니다. 다음을 수행할 수 있습니다.
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
기본 매개변수 확장을 통해 명령 대체 출력을 생성할 수 있도록 더미 변수로만 사용됩니다.