Bash 如何在shell脚本中检查IP版本(4或6)

Bash 如何在shell脚本中检查IP版本(4或6),bash,shell,Bash,Shell,我想检查IP是版本4还是版本6。 输入是字符串形式的IP地址。 例如: IP version 4 --> 1.1.1.1 IP version 6 --> 12:1201::12:15 要检查IPV4,请执行以下操作: ip='1.1.1.1' awk -F. 'NF == 4' <<< "$ip" 1.1.1.1 ip='1.1.1.1' awk-F.'NF==4'要检查IPV4: ip='1.1.1.1' awk -F. 'NF == 4' <<

我想检查IP是版本4还是版本6。 输入是字符串形式的IP地址。 例如:

IP version 4 --> 1.1.1.1
IP version 6 --> 12:1201::12:15
要检查IPV4,请执行以下操作:

ip='1.1.1.1'
awk -F. 'NF == 4' <<< "$ip"
1.1.1.1
ip='1.1.1.1'
awk-F.'NF==4'要检查IPV4:

ip='1.1.1.1'
awk -F. 'NF == 4' <<< "$ip"
1.1.1.1
ip='1.1.1.1'

awk-F.'NF==4'您可以检查字符串是否包含冒号
,然后它是IPv6地址,否则它是IPv4地址:

string='1.1.1.1';

if [[ $string =~ .*:.* ]]
then
  echo "IPv6"
else
  echo "IPv4"
fi

您可以检查字符串是否包含冒号
,然后它是IPv6地址,否则它是IPv4地址:

string='1.1.1.1';

if [[ $string =~ .*:.* ]]
then
  echo "IPv6"
else
  echo "IPv4"
fi
无外部调用的本机POSIX(无bashisms)解决方案:

#!/bin/sh

if [ "$1" != "${1#*[0-9].[0-9]}" ]; then
  echo IPv4
elif [ "$1" != "${1#*:[0-9a-fA-F]}" ]; then
  echo IPv6
else
  echo "Unrecognized IP format '$1'"
fi
这使用POSIX替换
${1}*[0-9].[0-9]}
是第一个参数,将第一个字符替换为第一个数字点号(因此它与未修改的第一个参数不匹配),用于标识IPv4地址,
${1}*:[0-9a-fA-F]}
与冒号十六进制相同,用于标识IPv6地址。为了安全起见,我检查了这两个IP,并对无效IP进行了回退

这并不准确,只是速度快而已。在POSIX shell中可以实现精确匹配,但这很难实现

perl
中:

#/usr/bin/perl
$=移位;
咀嚼;
如果(/^(\d+)\(\d+)\(\d+)\(\d+)$/&&&$1本机POSIX(无bashisms)解决方案没有外部调用:

#!/bin/sh

if [ "$1" != "${1#*[0-9].[0-9]}" ]; then
  echo IPv4
elif [ "$1" != "${1#*:[0-9a-fA-F]}" ]; then
  echo IPv6
else
  echo "Unrecognized IP format '$1'"
fi
这使用POSIX替换;
${1}*[0-9].[0-9]}
是第一个参数,将第一个字符替换为第一个数字点号(因此它与未修改的第一个参数不匹配),它标识IPv4地址和
${1}:[0-9a-fA-F]}
对于冒号十六进制也是一样的,它标识一个IPv6地址。为了安全起见,我会同时检查这两个地址,并对无效的IP设置回退

这不是精确的,只是速度快而已。在POSIX shell中,精确匹配是可能的,但它很难实现

perl
中:

!/usr/bin/perl
$=移位;
咀嚼;

如果(/^(\d+)\(\d+)\(\d+)/&&&1查找
v.s.
?查找
v.s.
?在
“123.456:something”
之类的字符串上很容易失败,应该测试为“不是IP地址”,但上面的代码将作为IPv4或IPv6进行测试,这取决于您进行测试的顺序…所有其他答案也是如此。任何其他答案都需要正则表达式。我将把它添加到我的答案中。即使是正则表达式也不足够。正确的答案是解析字符串,确保它包含正确数量的字段,separa由适当的分隔符分隔,并且每个字段值都在有效范围内-例如,111.222.333.444不是有效的IP地址,即使大多数只查看字符串形式的正则表达式都会声称它是…在字符串(如
“123.456:something”
)上很小地失败,应该测试为“不是IP地址”,但上面的代码将作为IPv4或IPv6进行测试,这取决于您进行测试的顺序…所有其他答案也是如此。任何其他答案都需要正则表达式。我将把它添加到我的答案中。即使是正则表达式也不足够。正确的答案是解析字符串,确保它包含正确数量的字段,separa由适当的分隔符分隔,并且每个字段值都在有效范围内-例如111.222.333.444不是有效的IP地址,即使大多数只查看字符串形式的正则表达式都会声明它是。。。