这个问题是关于在 bash 下的匹配表达式中编写正则表达式文字的正确方法。
在 zsh 中,正如我所料,下面的匹配成功了:
% [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0
在 bash 中并非如此:
$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
1
我知道这场比赛在 bash 中成功
$ ( regexp='^ [0-9]+ $'; [[ ' 123 ' =~ $regexp ]]; echo $? )
0
...但它需要将正则表达式分配给中间变量。
我的问题是:如何在 bash 下的匹配表达式中编写任意正则表达式文字?
按照 Bash 参考手册3.2.4.2 Conditional Constructs的建议,最好将其放入变量中:
但是,为了直接在 bash 扩展测试中编写它,您需要删除引号并转义空格:
在 bash 中,规范的答案是:使用 var
这适用于空格、反斜杠和许多其他内容:
如果你想把它写成文字,你需要(小心地)引用。
您需要引用需要字面意义的部分,并将应解释为正则表达式的部分不加引号。空间需要引用。这里使用反斜杠:
在这里使用双引号:
但是这种“引用”会因为反斜杠之类的东西而变得非常混乱:
更简单、更安全:
而且,不,您不需要子外壳来执行此操作(问题中的括号)。
是的,这可能看起来很烦人。而且,是的,您提供的命令恰好在 zsh 中工作:
但是引用总是一个问题(在任何 shell 中),反斜杠会发生什么?:
双倍!它不完全是:字面量。