linux shell:bash 正则表达式判断操作符 =~ 的问题

今天完成了一个纯shell脚本的小项目,里面用到了大量的正则表达式判断,就是利用shell 的 =~ 操作符判断字符串是否匹配指定的正则表达式以验证用户输入的有效性。

关于bash正则表达式的条件判断操作符=~,gnu官方网站上《Bash Reference Manual(Bash参考手册)》有详细说明 1

差不多就是这样子,使用很方便

$ [[ "hello world" =~ wor(ld)? ]] && echo matched
matched

开发这个小项目时我在macOS和windows/MSYS下都测试通过了,以为大功告成的时候,拿到ubuntu下一跑,居然通不过。

如此简单的一个正则表达式判断居然不能匹配

$ [[ 'unknow_author' =~ ^[[:alnum:].-_]+$ ]] && echo matched

上面的代码在macOS和Windows/MSYS下都会输出‘matched’,表示字符串unknow_author匹配正则表达式[[:alnum:].-_]+$
但在ubuntu 16.04,和 CentOS 7下都不能正确输出,百思不得其解。
只好再翻《Bash Reference Manual》的原文,在3.2.5.2 Conditional Constructs章节找到
下面这段的说明,意思就是如果=~ 右边的正则表达语法不正确,则[[ expression ]] 表达式会返回2
在这里插入图片描述
赶紧到ubuntu下验证,如下图果然返回2,
在这里插入图片描述
也就是说bash认为^[[:alnum:].-_]+$这个正则表达式有语法错误,可是何错之有啊?难道不识别[:alnum:]?,换成^[a-zA-Z0-9.-_]+$也还是不行。
只好把目光聚焦到后半段.-_,这里原本代表三个字符,会不会bash把这个-当做表示区间的符号(类型0-9中的-)?我果断修改它们的顺序,改为._-,再次测试,通过!
在这里插入图片描述

同样是bash,为什么macOS和 Windows/MSYS 下就没问题呢?我检查了几个平台的bash版本,做成下表格,一目了然,不用怀疑这是bash的bug,至少在4.4.38以后的版本才解决的:

OSBash version^[[:alnum:].-_]+$TEST Result
MacOS(Big Sur 11.4)5.1.4OK
Windows Git Bash4.4.23OK
ubuntu 16.044.3.48FAIL
CentOS 74.2.46FAIL

所以为了避免上面的问题,建议在正则表达式中‘[]’中用到‘-’做普通符号要把它放在最后一个以避免低版本的bash把它当做区间符号。

参考资料


  1. 《3.2.5.2 Conditional Constructs》 ↩︎

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值