帮忙测试一个脚本:判断IP地址的正确与合法!

sh/bash/dash/ksh/zsh等Shell脚本
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#16

帖子 cnkilior » 2008-08-21 13:05

代码: 全选

echo 0.0.0.0 | sed -e 's/0\.0\.0\.0/Y/p' -n -e 's/^\([1-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)$/Y/p'
这样差不多了!

谢谢骨头!

--------
明白了,sed对两个-e命令,要将模式空间的内容分别加以应用,是”并行“的,而不是”串行“的!就达到了或者的效果!
-n对全局生效!
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#17

帖子 cnkilior » 2008-08-22 17:24

郁闷还有非法IP地址:
255开头的除了255.255.255.255

代码: 全选

echo 0.0.0.0 | sed -e 's/\(0\.0\.0\.0\|255\.255\.255\.255\)/Y/p' -n -e 's/^\([1-9]\{1\}\|[1-9][0-9]\|2[0-5][0-4]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)\.\([0-9]\{1\}\|[1-9][0-9]\|2[0-5][0-5]\|1[0-9]\{2\}\)$/Y/p' 
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#18

帖子 cnkilior » 2008-08-25 9:24

觉得以前的方法不好,写了个新方法:

代码: 全选

#!/bin/sh
if ! [ $# -eq 1 ]
then
echo "bad argv"
exit 1
fi
IFS=.
set $*
if ! [ $# -eq 4 ]
then
echo "bad ip"
exit 2
fi
if [ $1 -lt 0 ]||[ $2 -lt 0 ] || [ $3 -lt 0 ] || [ $4 -lt 0 ]
then
echo "bad ip"
exit 1
fi
if [ $1 -eq 0 ]
then
[ $2 -eq 0 ]&&[ $3 -eq 0 ]&&[ $4 -eq 0 ]&&exit 0
exit 2
elif [ $1 -eq 255 ]
then
[ $2 -eq 255 ]&&[ $3 -eq 255 ]&&[ $4 -eq 255 ]&&exit 0
exit 2
elif [ $1 -gt 0 ]&&[ $1 -lt 255 ]
then
[ $2 -lt 256 ]&&[ $3 -lt 256 ]&&[ $4 -lt 256 ]&&exit 0
exit 2
else
exit 2
fi

漂亮吧!
上次由 cnkilior 在 2008-08-25 9:46,总共编辑 3 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#19

帖子 eexpress » 2008-08-25 9:27

我都给出了标准的,就不看?搞这么长?
● 鸣学
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#20

帖子 cnkilior » 2008-08-25 9:38

你的只能判断:999.999.999.999是正确的ip
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#21

帖子 cnkilior » 2008-08-27 15:32

改進了一點:增強容錯能力!感覺還是sed匹配比較簡單,但難讀!

代码: 全选

#!/bin/sh
if ! [ $# -eq 1 ]
then
exit 1
fi
IP=$*
IFS=[0-9]
set $IP
if [ $# != 4 ]||[ -n "$1" ]
then
exit 2
fi
IFS=.
set $IP
if ! [ $# -eq 4 ]
then
exit 2
fi
if [ $1 -eq 0 ]
then
[ $2 -eq 0 ]&&[ $3 -eq 0 ]&&[ $4 -eq 0 ]&&exit 0
exit 2
elif [ $1 -eq 255 ]
then
[ $2 -eq 255 ]&&[ $3 -eq 255 ]&&[ $4 -eq 255 ]&&exit 0
exit 2
elif [ $1 -gt 0 ]&&[ $1 -lt 255 ]
then
[ $2 -lt 256 ]&&[ $3 -lt 256 ]&&[ $4 -lt 256 ]&&exit 0
exit 2
else
exit 2
fi
上次由 cnkilior 在 2008-08-27 17:13,总共编辑 3 次。
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#22

帖子 bones7456 » 2008-08-27 16:15

LZ...别怪我打击你...

代码: 全选

$ ping 127.1
$ ping 127.0.1
试试...
关注我的blog: ε==3
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#23

帖子 cnkilior » 2008-08-27 16:37

你太狠了!

這也是Ip。。。

唉!

看來要排除本地回路了!誰知道還有什么奇怪格式的。。

不過也可以無視他!因為他不是普通的ip!
----
這不是一個“正確”的ip,正常的ip是每8位2進制翻譯為10進制數并用.分開。也可以全部或部分翻譯為10進制數,并用.隔開。(不知道是不是linux ping奇怪的地方)

代码: 全选

 ping 1.11111
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#24

帖子 bones7456 » 2008-08-27 17:13

127.1 绝对是个合法的IP,十进制数用点隔开的时候,如果中间有一个或多个 0,可以把这些0省略的.
而且这个和本地回路无关, 123.0.0.1 也可以简写成 123.1

而且还可以用大整数,啊哈哈, ping 1.1.1.1 相当于 ping 16843009

而且这不是linux的ping才这样的,win也一样...
关注我的blog: ε==3
头像
yaoms
帖子: 4952
注册时间: 2007-10-19 14:51
来自: 深圳

#25

帖子 yaoms » 2008-08-27 17:18

ipv6 的 呢
附件
IPv6的表示方法
IPv6的表示方法
上次由 yaoms 在 2008-08-27 17:18,总共编辑 1 次。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#26

帖子 cnkilior » 2008-08-27 17:18

對是合法但不是正確的書寫習慣。是吧!

---
要把不同的書寫習慣包含進去,不是不能做,是太麻煩!

代码: 全选

#!/bin/sh
ping -c 4 $* >/dev/null
檢查$?就可以了!
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#27

帖子 bones7456 » 2008-08-27 17:32

cnkilior 写了:對是合法但不是正確的書寫習慣。是吧!

---
要把不同的書寫習慣包含進去,不是不能做,是太麻煩!

代码: 全选

#!/bin/sh
ping -c 4 $* >/dev/null
檢查$?就可以了!
那在没有网络的情况下,就歇菜了...
关注我的blog: ε==3
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

Re: 帮忙测试一个脚本:判断IP地址的正确与合法!

#28

帖子 cnkilior » 2008-10-28 16:18

不好意思,我又把它挖出来了。
我刚才突然发现IFS不好用了,特别是那句IFS=[0-9],bash把[0-9]作为IFS了,而不是其含义:以数字作为IFS。
我用的电脑是公共电脑,不知道是谁改了什么。有一次我发现tr也不识别[0-9],但他可以用0123456789代替,但IFS虽然也可以这样写,但是还是会在set时出错(得不到预期的结果)。

没有办法,我只好改了。

代码: 全选

#!/bin/sh
if ! [ $# -eq 1 ]
then
exit 1
fi
IP=$1
set $(echo $IP|tr [0-9] " ")
if [ $# != 3 ]
then
exit 2
fi
set $(echo $IP|tr '.' " ")
if ! [ $# -eq 4 ]
then
exit 2
fi
if [ $1 -eq 0 ]
then
[ $2 -eq 0 ]&&[ $3 -eq 0 ]&&[ $4 -eq 0 ]&&exit 0
exit 2
elif [ $1 -eq 255 ]
then
[ $2 -eq 255 ]&&[ $3 -eq 255 ]&&[ $4 -eq 255 ]&&exit 0
exit 2
elif [ $1 -gt 0 ]&&[ $1 -lt 255 ]
then
[ $2 -lt 256 ]&&[ $3 -lt 256 ]&&[ $4 -lt 256 ]&&exit 0
exit 2
else
exit 2
fi
不过它没有经过详细测试
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

Re: 帮忙测试一个脚本:判断IP地址的正确与合法!

#29

帖子 cnkilior » 2008-10-28 16:19

问一句:bash的什么设定可能会影响到这个?
回复