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

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

假设我定义了一个变量,例如

number=123#456

我想打印它而不带前导“123#”。 (当您处理除 10 以外的基数的数字时,这种情况会在 zsh 中发生。)“参数扩展”手册的一部分说,

${name#pattern}

${name##pattern}

如果模式与值的开头匹配姓名,然后代入值姓名删除匹配部分;否则,只需替换为姓名。第一种形式,优先选择最小的匹配模式;在第二种形式中,优先选择最大的匹配模式。

这对我来说意味着我应该能够说

print ${number#123#}

去掉“123#”,但这实际上输出“3#456”。我发现如果我转义我试图删除的“#”,我可以获得预期的效果:

print ${number#123\#}    # prints "456"

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

答案1

#是一个全局运算符这意味着“前面的字符或括号组出现零次或多次”。这是编写正则表达式运算符的 zsh 方式*。因此,在采用最短匹配 ( ) 时开始123#匹配,在采用最长匹配 ( ) 时匹配。12123#456${number#123#}123${number##123#}

操作#员仅在以下情况下才处于活动状态:extended_glob选项已设置。默认情况下未设置此选项,但通常在配置中设置它(因为它非常有用且基本上不烦人),并且始终在执行完成函数时设置它。

相关内容