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 之间兼容的代码。

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

谢谢 !

4

1 回答 1

8

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

解决方案是删除引号。


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

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

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

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

为了实现交叉兼容性(以避免必须转义括号、管道等),请使用变量来存储您的正则表达式,例如,re='^\*( >| *Applying |.*\.diff|.*\.patch)'; [[ $var =~ $re ]]这更容易维护,因为您只编写 ERE 语法并避免了 shell 转义的需要,以及与所有 3.x BASH 版本兼容。

顺便说一句,没有必要转义.括号内的表达式。

于 2016-07-08T13:52:09.417 回答