【问题标题】:Regular Expression : bash 3 vs bash 4正则表达式:bash 3 vs bash 4
【发布时间】:2016-11-11 02:57:34
【问题描述】:

以下带有正则表达式检查的代码不会在 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 之间兼容的代码。

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

谢谢!

【问题讨论】:

  • 3.2 on mine 输出 1 有一个空行...不管你不应该引用正则表达式。
  • 我在 redhat 机器上。

标签: regex linux bash shell bash4


【解决方案1】:

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

解决办法是去掉引号。


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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多