Regular-Expression
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
[ $x = '*test*' ]
測試由擴展產生的字元串$x
,即text
,是否等於由擴展產生的字元串'*test*'
,即*text*
。要測試變數的值是否與模式
x
匹配,您需要使用zsh 條件表達式的or運算符,它們寫在雙括號內。此外,模式中的特殊字元必須不加引號,否則它們代表自己。因此:*test*``=``==
[[ … ]]
if [[ $x == *test* ]]; then …
條件表達式的語法類似於可以在單括號內使用的表達式的語法
[ … ]
,但並不完全相同。[
像普通命令一樣被解析;實際上,它是一個只有一個字元名稱的內置命令,它與內置命令相同,test
只是在[
末尾需要一個額外的參數,必須是]
.[[ … ]]
是一個獨特的語法結構,它允許它在裡面有 shell 特殊字元。[ $x = *test* ]
將擴展*test*
到匹配的文件名列表(萬用字元),並且test
內置程序最終會解析結果。作為不呼叫萬用字元的條件表達式解析的一部分進行解析[[ $x = *test* ]]
。*test*