zsh 条件表达式中的模式匹配

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)

Gil*_*il' 9

[ $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。


jes*_*e_b 5

*test*不是有效的正则表达式模式。The*是一个重复操作符,需要重复一些东西。您很可能想要.*test.*,尽管这对于正则表达式来说不是必需的,因为默认情况下它没有锚定。你可以找test

但是,您无法将正则表达式模式与=运算符匹配,您需要=~.

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