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
试试...
-
cnkilior
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#23
帖子
由 cnkilior » 2008-08-27 16:37
你太狠了!
這也是Ip。。。
唉!
看來要排除本地回路了!誰知道還有什么奇怪格式的。。
不過也可以無視他!因為他不是普通的ip!
----
這不是一個“正確”的ip,正常的ip是每8位2進制翻譯為10進制數并用.分開。也可以全部或部分翻譯為10進制數,并用.隔開。(不知道是不是linux ping奇怪的地方)
-
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也一样...
-
yaoms
- 帖子: 4952
- 注册时间: 2007-10-19 14:51
- 来自: 深圳
#25
帖子
由 yaoms » 2008-08-27 17:18
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
檢查$?就可以了!
那在没有网络的情况下,就歇菜了...
-
cnkilior
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#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
#29
帖子
由 cnkilior » 2008-10-28 16:19
问一句:bash的什么设定可能会影响到这个?