私の質問は、ここで尋ねられた質問に相当するzshです: どのようにして変数をケース条件として使用できますか? 変数をzshのcaseステートメントの条件。例えば:
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
ケース条件を実行させたいと思います。
このコードをファイル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
_