假设我已经定义了一个变量
number=123#456
我想在没有前导“123#”的情况下打印它。(当您使用 10 以外的基数时,在 zsh 中会发生这种情况。)手册的“参数扩展”部分说,
${name#pattern}
${name##pattern}
如果模式匹配name值的开头,则用删除的匹配部分替换name的值;否则,只需替换name的值。在第一种形式中,最小的匹配模式是优选的;在第二种形式中,最大匹配模式是首选。
这表明我应该能够说
print ${number#123#}
摆脱“123#”,但这实际上输出“3#456”。我发现如果我逃避我试图删除的“#”,我可以获得预期的效果:
print ${number#123\#} # prints "456"
“#”在我逃脱之前有什么特殊含义?
#
是一个glob 运算符,表示“前面的字符或括号组出现零次或多次”。*
这是编写正则表达式运算符的 zsh 方式。因此,在取最短匹配时匹配 (123#
) ,在取最长匹配时匹配 ( )。12
123#456
${number#123#}
123
${number##123#}
操作员仅在设置该选项
#
时才处于活动状态。extended_glob
默认情况下未设置此选项,但通常在您的配置中设置它(因为它非常有用且基本上不烦人),并且始终在执行完成功能时设置。