You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:48:19