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