我有以下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"