bash - 为什么在 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 版本 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
推荐阅读
- javascript - 没有onclick wordpress的重定向页面
- swift - 检查协议数组中的对象是否为子类类型
- flutter - 小部件构建后如何获取状态更改值?
- mongodb - 如果数组中的所有元素都匹配条件,Mongo 删除文档
- html - 带有 css 的 Django 模板条件
- forms - FLUSHBAR:任何熟悉这个包的人,如何在其中创建一个表单?
- apache-spark - Spark Streaming 到达数据框列并添加查找 Redis 的新列
- corpus - 带有循环的 textstat_simil 中的唯一元素列表
- django - Django 动态过滤 ListView 返回错误:get() 为参数“self”获取了多个值
- node.js - 对于内容安全问题,我的条带没有运行