最后一个字节验证不适用于 bash 中的 IP



我有以下bash脚本来验证IP地址:

#!/bin/bash
validFormatIP()
{
    grep -E -q '^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' <<< "$1" && echo "Valid IP" || echo "Invalid IP" 
}
validFormatIP $1

它正确验证第一个、第二个和第三个字节的 IP 地址,但不验证第四个字节。

这是我的脚本的输出,以更好地说明出了什么问题:

$ ./script.bash 1000.33.0.1
Invalid IP
$ ./script.bash 34.1000.0.1
Invalid IP
$ ./script.bash 34.33.1000.1
Invalid IP
$ ./script.bash 34.33.0.1000
Valid IP
$ 

如您所见,它接受1000作为最后一个字节的有效值,即使它实际上是无效的。

有人知道问题出在哪里吗?

您需要在

正则表达式的末尾添加 $,它会告诉正则表达式以确保最后一个字符与模式匹配。

^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

应该为你工作!

但是,这里有一个更短的模式,应该做同样的事情。

^((25[0-5]|2[0-4][0-9]|1?[0-9]{1,2}).){3}(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})$

您可以使用 {x,X} 指定最小值和最大值 x=min 和 X=MAX,当然您需要将其放在一些引号中。

这仅仅是因为您没有将其锚定在末尾,因此它与"34.33.0.1000"中的"34.33.0.100"匹配。 在表达式末尾添加$

    grep -E -q '^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' <<< "$1" && echo "Valid IP" || echo "Invalid IP" 

相关内容

  • 没有找到相关文章

最新更新