首页 > 解决方案 > 为什么在 bash 3.2 中右侧为空的正则表达式匹配为假,而在 4.2 中为真?

问题描述

给定两个字符串:-

a="hello h" 
b="" 

在 bash 版本 4.2 中,它们的正则表达式比较结果为 true

[[ "${a}" =~ "${b}" ]]
echo $?                           # 0

在 bash 版本 3.2 中,正则表达式比较结果为 false

[[ "${a}" =~ "${b}" ]]
echo $?                           # 2

编辑:第一个结果是在带有 4.2.46(2)-release bash 的 linux os 上运行,而第二个结果是在运行 3.2.57(1)-release bash 的 OS Mojave 上运行。

标签: bash

解决方案


bash 正则表达式匹配在 bash 版本中表现不同

显然他们确实如此。

在 bash 版本 3.2 中,正则表达式比较结果为 false

这不太正确。您指出退出状态为 2,这表明给定的模式在语法上不正确。这是一个失败的结果,是的,并且状态将在布尔上下文中被视为 false,但它并不表示字符串与模式不匹配。相反,它表示根本没有执行正则表达式匹配尝试。

我不确定在哪里可以找到 Bash 3.2 的手册,它已经很老了,但它拒绝空的正则表达式并不疯狂。您应该能够通过专门处理空正则表达式案例来解决该问题:

[[ -z "${b}" ]] || [[ "${a}" =~ "${b}" ]]
echo $?

但是请注意,引用正则表达式会导致它被视为纯字符串。如果您想测试存储在变量中的纯字符串是否b显示为存储在中的字符串的子字符串a,那么您也可以通过case表达式来执行此操作:

case $a in
  *${b}*) echo "it matches" ;;
  *)      echo "it doesn't match" ;;
esac

推荐阅读