내 질문은 여기에 묻는 질문에 해당하는 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