我有以下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作为最后一个字节的有效值,尽管它实际上是无效的。
有人知道问题在哪里吗?
发布于 2014-02-26 07:35:01
您需要将$添加到regex的末尾,它将告诉regex以确保最后一个字符与模式匹配。
^(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}来指定min和max x=min和X=MAX,当然还需要在一些引号中删除它。
发布于 2014-02-26 07:30:13
这仅仅是因为你没有在最后锚定它,所以它与"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" https://stackoverflow.com/questions/22034341
复制相似问题