正则表达式:bash 3 与 bash 4

Regular Expression : bash 3 vs bash 4

带有正则表达式检查的后续代码不会在 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 的两个版本之间兼容的代码。

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

谢谢!

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

解决办法是去掉引号。


使用正则表达式的推荐方法是这样的:

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

此语法应该适用于所有支持正则表达式的 bash 版本。该变量不是绝对必要的,但它提高了可读性。有关详细信息,请参阅 Greg 的维基 regular expressions section

关于变量的使用(来自上面的link):

For cross-compatibility (to avoid having to escape parentheses, pipes and so on) use a variable to store your regex, e.g. re='^\*( >| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]] This is much easier to maintain since you only write ERE syntax and avoid the need for shell-escaping, as well as being compatible with all 3.x BASH versions.

顺便说一句,括号表达式中的.不需要转义。