请帮助我理解下面的语法:
#!/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
。
我该如何解决这个问题?
答案 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}$' ]]
我没有使用单引号。