Bash脚本 - 无法验证ip

时间:2014-07-09 13:20:30

标签: shell

请帮助我理解下面的语法:

#!/bin/bash
read -p "enter your value"  ip
if [[ $ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]
then
    echo "valid"
else
    echo "invalid"
fi

输入923.234214.23,结果为valid。 使用923.3444.2123,它是invalid

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

我认为您使用的是.而不是\.

以下脚本应该执行您想要的操作:

#!/bin/bash
read -p "enter your value" ip
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
   then
     echo "valid"
   else
     echo "invalid"
fi

如果您希望更高级的脚本实际检查给定数字的范围,您可以查看此linux journal article

答案 1 :(得分:3)

现在要获得真正的答案,如果您只想使用bash检查IPv4地址,则必须使用稍微复杂的正则表达式。我在这里使用一个中间变量来保持事情的可理解性:

BYTE='((0*1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))'
#      ^^^^^^^^^^^^^^^^^                           matches 0-199 (with optional leading zeros
#                        ^^^^^^^^^^^^^             matches 200-249
#                                      ^^^^^^^^^   matches 250-255
if [[ $ip =~ ^$BYTE\.$BYTE\.$BYTE\.$BYTE$ ]]
then
    # ...
else
    # ...
fi

答案 2 :(得分:1)

这是一个评论,而不是一个真正的答案,但......

# _your_ regex:
sh$ [[ 923.34442.123 =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]] && echo ok || echo notok
ok

# regex using backslash:
sh$ [[ 23.34442.123 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && echo ok || echo notok
notok

正如已经解释过的那样,关键是使用反斜杠\)。 dot .)单独匹配任何单个字符。 [0-9]{1,3}部分表示"匹配任何1到3位的序列"。

因此,从广义上讲,你的正则表达式会匹配任何包含4个1到3位数字的字符串,这些数字由任何字符分隔:

9  2  3  .  3  4  4  4  2  .  1  2  3

d  d  d  a  d  d  d  a  d  a  d  d  d
i  i  i  n  i  i  i  n  i  n  i  i  i
g  g  g  y  g  g  g  y  g  y  g  g  g
i  i  i  c  i  i  i  c  i  c  i  i  i
t  t  t  h  t  t  t  h  t  h  t  t  t
         a           a     a
         r           r     r

起初可能会令人惊讶,但它匹配......


作为旁注,即使是"反斜杠点正则表达式"将接受无效的IPv4地址:例如923.34.42.123匹配,但显然不正确。因此,有趣的是,基于awk的过滤器(及其测试集)可从列表中删除无效的IPv4地址。随意适应您的需求(或完全忽略它;)

sh$ BYTE='[0-2]?[0-9]?[0-9]' # Might even be BYTE='0*[0-2]?[0-9]?[0-9]'
sh$ cat << EOF | awk -v FS='.' "/^$BYTE\.$BYTE\.$BYTE\.$BYTE$/"' {
                                   if (($1<= 255)&&($2<=255)&&($3<=255)&&($4<=255))
                                      print $0 }'              
4.2.2.2
a.b.c.d
192.168.1.1
0.0.0.0
255.255.255.255
255.255.255.256
192.168.0.1
192.168.0
1234.123.123.123
EOF

结果如下:

4.2.2.2
192.168.1.1
0.0.0.0
255.255.255.255
192.168.0.1

答案 3 :(得分:0)

感谢您的回复 最后我找到了解决方案

if [[ $ip =~ '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ]]

我没有使用单引号。