正则表达式:bash 3与bash 4的区别

3

使用正则表达式检查的以下代码在bash 3和bash 4之间输出的结果不相同:

TESTCASE="testcase0"
[[ ${TESTCASE} =~ "^testcase[0-9\.]*$" ]]
echo $?
echo ${BASH_REMATCH}

bash 3.2 输出正则表达式检查成功的结果:

0
testcase0

bash 4.1无法通过正则表达式检查:

1
<empty line>

我无法确定正则表达式模式中哪些表达式失败了。我需要一段适用于两个版本的bash的代码。

有人知道我的问题是什么吗?

谢谢!


我的输出是1,带有一个空行... 无论如何,您不应该引用正则表达式。 - 123
我正在使用一台红帽(Red Hat)机器。 - LAL
1个回答

9

在旧版本的Bash(3.1)中,可以在测试中使用引号来表示正则表达式。在新版本中,引号被视为模式的一部分,因此匹配失败。

解决方法是去掉引号。


推荐使用正则表达式的方式如下:

re='^testcase[0-9\.]*$'  # single quotes around variable
[[ ${TESTCASE} =~ $re ]] # unquoted variable used in test

这个语法在所有支持正则表达式的bash版本中都有效。虽然变量不是必需的,但它可以提高可读性。有关更多详细信息,请参见Greg的维基百科正则表达式部分
关于使用变量(来自上面的链接):
为了实现跨平台兼容性(避免必须转义括号、管道等),请使用一个变量来存储您的正则表达式,例如 re='^\*( >| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]]。这样做更容易维护,因为您只需要编写ERE语法,避免了需要对shell进行转义,同时还与所有3.x BASH版本兼容。
顺便说一下,在方括号表达式内部不需要转义.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接