![在 zsh 中使用变量作为 case 条件](https://linux22.com/image/134133/%E5%9C%A8%20zsh%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F%E4%BD%9C%E4%B8%BA%20case%20%E6%9D%A1%E4%BB%B6.png)
我的问题是 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
我想使用字符串foo
orbar
并让上面的代码执行pattern
case 条件。
答案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