分页: 2 / 2

发表于 : 2008-08-21 13:05
cnkilior

代码: 全选

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对全局生效!

发表于 : 2008-08-22 17:24
cnkilior
郁闷还有非法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' 

发表于 : 2008-08-25 9:24
cnkilior
觉得以前的方法不好,写了个新方法:

代码: 全选

#!/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

漂亮吧!

发表于 : 2008-08-25 9:27
eexpress
我都给出了标准的,就不看?搞这么长?

发表于 : 2008-08-25 9:38
cnkilior
你的只能判断:999.999.999.999是正确的ip

发表于 : 2008-08-27 15:32
cnkilior
改進了一點:增強容錯能力!感覺還是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

发表于 : 2008-08-27 16:15
bones7456
LZ...别怪我打击你...

代码: 全选

$ ping 127.1
$ ping 127.0.1
试试...

发表于 : 2008-08-27 16:37
cnkilior
你太狠了!

這也是Ip。。。

唉!

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

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

代码: 全选

 ping 1.11111

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

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

而且这不是linux的ping才这样的,win也一样...

发表于 : 2008-08-27 17:18
yaoms
ipv6 的 呢

发表于 : 2008-08-27 17:18
cnkilior
對是合法但不是正確的書寫習慣。是吧!

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

代码: 全选

#!/bin/sh
ping -c 4 $* >/dev/null
檢查$?就可以了!

发表于 : 2008-08-27 17:32
bones7456
cnkilior 写了:對是合法但不是正確的書寫習慣。是吧!

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

代码: 全选

#!/bin/sh
ping -c 4 $* >/dev/null
檢查$?就可以了!
那在没有网络的情况下,就歇菜了...

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

发表于 : 2008-10-28 16:18
cnkilior
不好意思,我又把它挖出来了。
我刚才突然发现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
不过它没有经过详细测试

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

发表于 : 2008-10-28 16:19
cnkilior
问一句:bash的什么设定可能会影响到这个?