Regular-Expression

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

  • November 23, 2019

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

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

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

$ zsh --version
zsh 4.3.11 RHEL 

[ $x = '*test*' ]測試由擴展產生的字元串$x,即text,是否等於由擴展產生的字元串'*test*',即*text*

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

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

條件表達式的語法類似於可以在單括號內使用的表達式的語法[ … ],但並不完全相同。[像普通命令一樣被解析;實際上,它是一個只有一個字元名稱的內置命令,它與內置命令相同,test只是[末尾需要一個額外的參數,必須是]. [[ … ]]是一個獨特的語法結構,它允許它在裡面有 shell 特殊字元。[ $x = *test* ]將擴展*test*到匹配的文件名列表(萬用字元),並且test內置程序最終會解析結果。作為不呼叫萬用字元的條件表達式解析的一部分進行解析[[ $x = *test* ]]*test*

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