Bash环境下验证CIDR地址有效性的正则表达式问题
解决Bash中CIDR地址验证的正则问题
你遇到的核心问题是Bash默认使用POSIX标准的正则表达式,而非Perl/PHP/JS常用的PCRE(Perl兼容正则)语法,所以\d这类PCRE专属标记无法直接生效,必须换成POSIX规范的写法,同时还要调整正则的锚定和转义规则。
调整后的Bash兼容正则
把原正则里所有的\d替换为POSIX标准的[[:digit:]],同时用^和$锚定整个字符串(替代原正则末尾的(?![.\d]),避免部分匹配),最终的正则如下:
^(((25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\.){3}(25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))\/([1-9]|[1-2][[:digit:]]|3[0-2])$
可直接运行的测试脚本
基于上面的正则,我修改了你的测试脚本,确保在Bash中能正常工作:
#!/bin/bash if [ "$1" = "" ]; then echo "Usage: $(basename $0) 192.168.1.0/24" exit 1 fi # 定义Bash兼容的CIDR验证正则 CIDR_REGEX='^(((25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\.){3}(25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))\/([1-9]|[1-2][[:digit:]]|3[0-2])$' if [[ $1 =~ $CIDR_REGEX ]]; then echo "✅ Valid CIDR address: $1" else echo "❌ Invalid CIDR address: $1" fi
额外方案:用Perl兼容模式快速复用原正则
如果你的系统支持grep -P(大部分Linux发行版都支持,BSD系统可能没有),可以直接复用你原来的PCRE正则,不用修改:
#!/bin/bash if [ "$1" = "" ]; then echo "Usage: $(basename $0) 192.168.1.0/24" exit 1 fi # 直接使用原PCRE正则,通过grep -P启用Perl兼容模式 echo "$1" | grep -qP '(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])' if [ $? -eq 0 ]; then echo "✅ Valid CIDR address: $1" else echo "❌ Invalid CIDR address: $1" fi
内容的提问来源于stack exchange,提问作者Mogens TrasherDK
相关产品推荐
相关产品推荐

