在 zsh 中使用变量作为 case 条件

在 zsh 中使用变量作为 case 条件

我的问题是 zsh 相当于这里提出的问题:如何使用变量作为 case 条件?我想在 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

我想使用字符串fooorbar并让上面的代码执行patterncase 条件。

答案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

相关内容