Tyl*_*lly 7 zsh string regular-expression wildcards test
我在 zsh 的钩子函数中遇到了模式匹配问题precmd
。我有以下几点:
precmd(){
local x='test'
if [ $x = '*test*' ]; then
echo 'hello'
fi
}
Run Code Online (Sandbox Code Playgroud)
它永远不会打印你好。我已经用正常zsh test.zsh
工作的正常代码测试了这段代码,并且我已经尝试过不使用正则表达式,precmd
并且打印出来的东西也很好。关于为什么这不能按预期工作的任何线索?
$ zsh --version
zsh 4.3.11 RHEL
Run Code Online (Sandbox Code Playgroud)
[ $x = '*test*' ]
测试扩展产生的字符串$x
,即text
,是否等于扩展产生的字符串'*test*'
,即*text*
。
要测试变量的值是否x
与模式 匹配*test*
,您需要使用zsh 条件表达式的=
or==
运算符,它们写在双括号内。此外,模式中的特殊字符必须不加引号,否则它们代表自己。因此: [[ … ]]
if [[ $x == *test* ]]; then …
Run Code Online (Sandbox Code Playgroud)
条件表达式的语法类似于可以在单括号内使用的表达式的语法[ … ]
,但不完全相同。[
像普通命令一样解析;事实上,它与一个字符的名称,这是相同的内置命令test
内置不同之处在于[
需要在必须是末端的附加自变量]
。[[ … ]]
是一个独特的语法结构,允许它在里面包含 shell 特殊字符。[ $x = *test* ]
将扩展*test*
到匹配的文件名列表(通配符),test
内置函数最终会解析结果。[[ $x = *test* ]]
解析*test*
为条件表达式解析的一部分,不调用 globbing。
*test*
不是有效的正则表达式模式。The*
是一个重复操作符,需要重复一些东西。您很可能想要.*test.*
,尽管这对于正则表达式来说不是必需的,因为默认情况下它没有锚定。你可以找test
但是,您无法将正则表达式模式与=
运算符匹配,您需要=~
.
precmd () {
local x=test
if [[ $x =~ test ]]; then
echo 'hello'
fi
}
Run Code Online (Sandbox Code Playgroud)