Regex 正则表达式:bash3与bash4

Regex 正则表达式:bash3与bash4,regex,linux,bash,shell,bash4,Regex,Linux,Bash,Shell,Bash4,以下带有正则表达式检查的代码在bash 3和bash 4之间不会输出相同的结果: TESTCASE="testcase0" [[ ${TESTCASE} =~ "^testcase[0-9\.]*$" ]] echo $? echo ${BASH_REMATCH} bash 3.2输出一个成功的正则表达式检查: 0 testcase0 1 <empty line> bash 4.1未能通过正则表达式检查: 0 testcase0 1 <empty line> 1

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

TESTCASE="testcase0"
[[ ${TESTCASE} =~ "^testcase[0-9\.]*$" ]]
echo $?
echo ${BASH_REMATCH}
bash 3.2输出一个成功的正则表达式检查:

0
testcase0
1
<empty line>
bash 4.1未能通过正则表达式检查:

0
testcase0
1
<empty line>
1
我无法确定在我的正则表达式模式中表达式在哪里失败。我需要一个在两个版本的bash之间兼容的代码

有人知道我有什么问题吗

谢谢

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

解决方法是删除引号


建议使用正则表达式的方法如下:

re='^testcase[0-9\.]*$'  # single quotes around variable
[[ ${TESTCASE} =~ $re ]] # unquoted variable used in test
这种语法应该适用于所有支持正则表达式的bash版本。变量不是严格必需的,但它提高了可读性。有关更多详细信息,请参见Greg's wiki的链接

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

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


顺便说一句,没有必要在括号表达式中转义

3.2
在我的输出1上有一个空行。。。无论如何,你不应该引用正则表达式。我在一台redhat机器上。