
我在 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
}