正则表达式: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.
顺便说一句,括号表达式中的.
不需要转义。
带有正则表达式检查的后续代码不会在 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.
顺便说一句,括号表达式中的.
不需要转义。