Shell-Script
在 zsh 中使用變數作為 case 條件
我的問題是這裡提出的問題的 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
case 條件。
將此程式碼保存到文件
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