zsh 條件表達式中的模式匹配

zsh 條件表達式中的模式匹配

我在 zsh 的鉤子函數中遇到模式匹配問題precmd。我有以下內容:

precmd(){
   local x='test'
   if [ $x = '*test*' ]; then
      echo 'hello'
   fi
}

它永遠不會打印你好。我已經用正常工作的正常程式碼測試了這段程式碼zsh test.zsh,並且我嘗試了不使用正則表達式precmd,並且也可以很好地列印出來。關於為什麼這不能按預期工作的任何線索嗎?

$ zsh --version
zsh 4.3.11 RHEL 

答案1

[ $x = '*test*' ]測試擴展後的字串$x(即text)是否等於擴展後的字串'*test*'(即 )*text*

測試變數的值是否x圖案 *test*,您需要使用===運算符zsh 條件表達式,其中寫有雙括號 [[ … ]]。此外,模式中的特殊字元必須不加引號,否則它們代表自己。因此:

if [[ $x == *test* ]]; then …

條件式的語法與可在單括號內使用的表達式的語法類似[ … ],但不完全相同。[像普通命令一樣被解析;事實上,它是一個帶有單字元名稱的內建命令,與test內建[最後需要一個附加參數,該參數必須是].[[ … ]]是一個獨特的語法結構,允許它內部包含 shell 特殊字元。[ $x = *test* ]將擴展*test*到匹配檔名的列表(通配符),並且test內建函數最終將解析其結果。作為條件表達式解析的一部分[[ $x = *test* ]]進行解析*test*,不會呼叫通配符。

答案2

*test*不是有效的正規表示式模式。這*是一個重複運算符,需要重複一些內容。這很可能是您想要的.*test.*,儘管對於正規表示式來說這不是必需的,因為預設情況下它不是錨定的。你可以只尋找test

但是,您無法將正規表示式模式與=運算符匹配,您需要=~.

precmd () {
   local x=test
   if [[ $x =~ test ]]; then
      echo 'hello'
   fi
}

相關內容