使用shell脚本进行IPV6地址验证

时间:2016-02-06 10:11:10

标签: regex bash shell

我使用下面的脚本来验证IPV6地址,但是这个脚本也传递了无效的IP,如空字符串,名称等。

if [[ "$IPv6ADDR"=~"^:?([a-fA-F0-9]{1,4}(:|.)?){0,8}(:|::)?([a-fA-F0-9]{1,4}(:|.)?){0,8}$" ]]; then
  echo "valid ipv6 addr"
else
  echo "Invalid IP Address"
fi

有人可以确定正则表达式中的错误吗?

1 个答案:

答案 0 :(得分:2)

它传递空字符串的原因是所有内容都是可选的或允许匹配0次:

  • ^ - 匹配字符串的开头
  • :? - 可选冒号
  • ([a-fA-F0-9]{1,4}(:|.)?){0,8} - 匹配0 - 8次(因此可选)
  • (:|::)? - 可选冒号或双冒号
  • ([a-fA-F0-9]{1,4}(:|.)?){0,8} - 匹配0 - 8次(因此可选)
  • $ - 匹配字符串结尾

因此允许使用空白字符串,因为您的模式允许字符串与任何可选部分都不匹配。

查看定义IP 6规范的RFC 4291,section 2.2定义了三种表示地址的方法。这可能是最简单的,如果您需要匹配所有表单以单独定义它们并将单独的正则表达式组合在一起,如

^(regex_pattern1|regex_pattern2|regex_pattern3)$

其中pattern1,例如,(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4},模式2和3是其他情况(模式1取自正则表达式食谱,第2版(O'Reilly,2012) )

或者,甚至更好(为了便于阅读),连续测试它们(伪代码如下),

if (matches pattern 1)
    echo 'valid'
else if (matches pattern 2)
    echo 'valid'
else if (matches pattern 3)
    echo 'valid'
else
    echo 'invalid'

另请参阅此question以获取更多信息。