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