“#”在参数扩展模式中有什么特殊含义?

bde*_*ham 5 zsh wildcards

假设我已经定义了一个变量

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)

“#”在我转义之前有什么特殊含义?

Gil*_*il' 8

#是一个glob 运算符,表示“前面的字符或括号组出现零次或多次”。这是编写*正则表达式运算符的 zsh 方式。因此123#比赛12在开始123#456服用最短的匹配(在${number#123#})和它匹配123耗时最长的比赛时,( ${number##123#})。

#当操作者唯一的活动extended_glob选项设置。默认情况下不设置此选项,但在您的配置中设置它是很常见的(因为它非常有用且在很大程度上不烦人),并且它总是在执行完成功能时设置。