Grep: 正则表达式不匹配 IP

17 浏览
0 Comments

Grep: 正则表达式不匹配 IP

我试图创建一个正则表达式来匹配一个 IP 地址,或者一个带有子网掩码的 IP 地址:

类似于 8.8.8.8/24

如果 ! [[ $SOURCE =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] || [[ $SOURCE =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$ ]];则
                echo 错误:无效的源
                exit 1
fi

第一部分匹配得很好,第二部分,带有子网掩码的却不匹配...

有人知道为什么吗?

0
0 Comments

问题的出现原因是,原始代码中使用了两个不同的正则表达式(RX1和RX2)来检查IP地址的有效性。而实际上,只需要使用一个正则表达式就可以完成这个检查。

解决方法是,在代码中将两个正则表达式合并成一个,并将其定义为一个变量(RX)。然后,通过将变量引用传递给[[...]],来进行IP地址的有效性检查。

下面是修改后的代码:

SOURCE="8.8.8.8"
RX="^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(/[0-9]{1,2})?$"
if ! [[ $SOURCE =~ $RX ]];then
    echo ERROR: Invalid Source
    exit 1
fi

这样修改后的代码只使用一个正则表达式(RX),而不再需要使用两个(RX1和RX2)。这样代码更简洁、更易读,同时也能正确地检查IP地址的有效性。

需要注意的是,将正则表达式放入变量中是最安全的方式,因为在[[...]]中,变量扩展可能会发生。详细信息可以参考这个[Stack Overflow回答](http://stackoverflow.com/a/18710850/3832970)。

0