web-dev-qa-db-ja.com

zshでケース条件として変数を使用する

私の質問は、ここで尋ねられた質問に相当する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ケース条件を実行させたいと思います。

6
Smashgen

このコードをファイル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
_
7
thrig