正则能匹配版本号但Bash脚本执行异常,如何解决?
Bash正则匹配版本号失败的解决办法
问题根源
Bash的[[ ... =~ ... ]]语法使用的是POSIX扩展正则表达式(ERE),和你用的在线测试工具(通常采用PCRE/Perl风格正则)语法不兼容:
- POSIX ERE不支持
\d(需替换为[0-9]) - POSIX ERE不支持负向前瞻断言
(?!...)这类Perl风格的零宽断言
修改后的兼容正则及脚本
把原正则转换成POSIX ERE兼容的写法,同时保留原版本号的校验逻辑(主版本号1-2位非0开头,次版本号1-3位不能以0开头除非是单个0,修订版本号1-4位同理):
#!/bin/bash VERSION='1.0.0' MATCH_PATTERN='^[1-9][0-9]{0,1}\.(0|[1-9][0-9]{0,2})\.(0|[1-9][0-9]{0,3})$' if [[ $VERSION =~ $MATCH_PATTERN ]]; then echo "版本格式正确" else echo "Version number format is wrong." exit 1 fi
正则逻辑说明
^[1-9][0-9]{0,1}:主版本号,允许1-2位数字,首位不能为0(如1、12合法,01不合法)\.(0|[1-9][0-9]{0,2}):次版本号,要么是单个0,要么是1-3位且首位非0的数字(如0、12、123合法,012不合法)\.(0|[1-9][0-9]{0,3})$:修订版本号,要么是单个0,要么是1-4位且首位非0的数字(如0、123、1234合法,0123不合法)
内容的提问来源于stack exchange,提问作者m00s3
相关产品推荐
相关产品推荐

