Shell-Script

在 zsh 中使用變數作為 case 條件

  • May 30, 2018

我的問題是這裡提出的問題的 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

我想使用字元串foobar讓上面的程式碼執行patterncase 條件。

將此程式碼保存到文件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

引用自:https://unix.stackexchange.com/questions/446374