前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux shell:bash 正则表达式判断操作符 =~ 的问题

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

作者头像
10km
发布2021-12-07 17:07:57
2.3K0
发布2021-12-07 17:07:57
举报
文章被收录于专栏:10km的专栏10km的专栏

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

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

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

代码语言:javascript
复制
$ [[ "hello world" =~ wor(ld)? ]] && echo matched
matched

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

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

代码语言:javascript
复制
$ [[ '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,为什么macOS和 Windows/MSYS 下就没问题呢?我检查了几个平台的bash版本,做成下表格,一目了然,不用怀疑这是bash的bug,至少在4.4.38以后的版本才解决的:

OS

Bash version

^[[:alnum:].-_]+$TEST Result

MacOS(Big Sur 11.4)

5.1.4

OK

Windows Git Bash

4.4.23

OK

ubuntu 16.04

4.3.48

FAIL

CentOS 7

4.2.46

FAIL

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

参考资料

  1. 《3.2.5.2 Conditional Constructs》 ↩︎
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档