Case 문 일치를 포함하는 특수 변수가 있습니까?

Case 문 일치를 포함하는 특수 변수가 있습니까?

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기본 매개변수 확장을 통해 명령 대체 출력을 생성할 수 있도록 더미 변수로만 사용됩니다.

관련 정보