zsh에서 변수를 케이스 조건으로 사용

zsh에서 변수를 케이스 조건으로 사용

내 질문은 여기에 묻는 질문에 해당하는 zsh입니다.변수를 사례 조건으로 사용하는 방법은 무엇입니까?zsh에서 케이스 문의 조건으로 변수를 사용하고 싶습니다. 예를 들어:

input="foo"
pattern="(foo|bar)"

case $input in
$pattern)
    echo "you sent foo or bar"
;;
*)
    echo "foo or bar was not sent"
;;
esac

문자열을 사용하고 싶 foo거나 bar위 코드에서 pattern대소문자 조건을 수행하도록 하고 싶습니다.

답변1

이 코드를 파일로 저장한 후 first,

pattern=fo*
input=foo
case $input in
$pattern)
   print T
   ;;
fo*)
   print NIL
   ;;
esac

-x변수는 참조 값으로 나타나는 반면 원래 표현식은 참조 값으로 나타나지 않는 것을 볼 수 있습니다 .

% zsh -x first
+first:1> pattern='fo*'
+first:2> input=foo
+first:3> case foo (fo\*)
+first:3> case foo (fo*)
+first:8> print NIL
NIL

즉, 변수는 리터럴 문자열로 처리됩니다. 충분한 시간을 투자하면 zshexpn(1)전역 교체 플래그를 깨닫게 될 것입니다.

   ${~spec}
          Turn on the GLOB_SUBST option for the evaluation of spec; if the
          `~'  is  doubled,  turn  it  off.   When this option is set, the
          string resulting from the expansion will  be  interpreted  as  a
          pattern anywhere that is possible,

$pattern따라서 이것을 사용하도록 수정하면

pattern=fo*
input=foo
case $input in
$~pattern)                # !
   print T
   ;;
fo*)
   print NIL
   ;;
esac

우리가 보는 것은

% zsh -x second
+second:1> pattern='fo*'
+second:2> input=foo
+second:3> case foo (fo*)
+second:5> print T
T

귀하의 경우 스키마를 인용해야 합니다.

pattern='(foo|bar)'
input=foo
case $input in
$~pattern)
   print T
   ;;
*)
   print NIL
   ;;
esac

관련 정보