Bash脚本正则匹配在macOS不生效 如何兼容Linux与macOS
问题根因
macOS 默认预装的 Bash 为 3.2 老旧版本,其内置的正则匹配引擎不支持\s这类PCRE风格的空白符简写,仅兼容POSIX标准正则语法,因此正则匹配逻辑失效;Linux环境一般预装Bash 4.x及以上版本,正则引擎支持上述PCRE简写语法,所以脚本可以正常运行。
跨平台兼容修改方案
将正则中所有\s替换为POSIX标准的空白符匹配写法[[:space:]]即可解决匹配失败问题,同时顺手修复原脚本匹配到none:前缀后未退出、会继续执行后续校验导致误报的逻辑漏洞,修改后的完整脚本如下:
#!/bin/bash FILE_CONTENT="fix: 110256 Módulo > Recurso" REGEX1="^none:[[:space:]].*" REGEX2="^(feat|Feat|feature|Feature|fix|Fix|break|Break|docs|Docs):[[:space:]][0-9]{1,}[[:space:]].*" if [[ $FILE_CONTENT =~ $REGEX1 ]]; then echo "Commit não incluído no CHANGELOG!" exit 0 fi if [[ $FILE_CONTENT =~ $REGEX2 ]]; then echo "Commit incluído no CHANGELOG!" else echo "Bad commit \"$FILE_CONTENT\", verifique o padrão." # 原脚本ERROR_MSG未定义,可自行补充错误提示内容 echo "${ERROR_MSG}" exit 1 fi
额外说明
- 如果确认commit信息中不会出现制表符作为分隔,也可以直接将
\s替换为半角空格,写法更简洁,兼容性同样有保障 - 无需通过升级macOS端Bash版本解决该问题,会额外增加协作者的环境配置成本,使用POSIX标准语法编写正则是成本最低的跨平台兼容方案
- 如果需要忽略commit类型的大小写匹配,可以给正则匹配加nocasematch配置,不需要手动枚举大小写开头的关键字,写法更简洁:在脚本开头加上
shopt -s nocasematch,REGEX2就可以简化为^(feat|feature|fix|break|docs):[[:space:]][0-9]{1,}[[:space:]].*
内容的提问来源于stack exchange,提问作者Kleyson Rios
相关产品推荐
相关产品推荐

