分页: 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奇怪的地方)
发表于 : 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的什么设定可能会影响到这个?