可以ping一段连续的ip地址也可以从文件中读取ip地址
并发执行
按照ping的顺序,对结果进行分类排序
#!/bin/sh
trap 'echo "before execute line:$LINENO" >/dev/null' DEBUG
d_buffer=/tmp/ipbuffer
declare -a IP # ip list
test() # test start end
{
local lsip=$1
local leip=$2
local t=0
echo "testting....."
while [ $lsip -le $leip ]
do
(
ping -c 1 -w 1 ${IP[$lsip]} >/dev/null 2>&1
te=`echo $?`
if [ $te -gt "0" ]
then
echo "${IP[$lsip]} lost"> $d_buffer/lost$t.buf
else
echo "${IP[$lsip]} ok"> $d_buffer/on$t.buf
fi
)&
((lsip++))
((t++))
done
wait
for ((a=0;a<t;a++))
do
if [ -e $d_buffer/on$a.buf ]
then
cat $d_buffer/on$a.buf>>error
fi
done
for ((b=0;b<t;b++))
do
if [ -e $d_buffer/lost$b.buf ]
then
cat $d_buffer/lost$b.buf>>error
fi
done
}
:>./error #Çå¿ÕerrorÎļþ
case $1 in
"-h"|"--help"|"")
echo -e "Usage:atping [-r] ip_start ip_end\natping 192.168.0.1 192.168.0.254#ping 192.168.0.1-192.168.0.254"
echo "atping -r #read ip from ip.txt "
;;
[1-2]*)
if [ ! -d $d_buffer ]
then
mkdir $d_buffer
fi
rm /tmp/ipbuffer/* 2&>/dev/null
startip=$1
endip=$2
declare -r sip=${startip##*.} # *.*.*.10
eip=${endip##*.}
ct=$((${endip##*.}-${startip##*.})) # *.*.*.10-*.*.*.5
for ((i=sip;i<=eip;i++))
do
IP[$i]=${startip%.*}.$i #10.10.10.*+10
done
test $sip $eip
exist=$(grep "ok" error|wc -l)
lost=$(grep "lost" error|wc -l)
cat error
echo -e "total:$ct\nexist:$exist .lost:$lost"
;;
-r)
IP=($(cat ip.txt))
count=`cat ip.txt|wc -l`
test 0 $count
exist=$(grep "ok" error|wc -l)
lost=$(grep "lost" error|wc -l)
echo -e "total:$count\nexist:$exist.lost:$lost"
;;
*) echo "wrong parameter"
exit
esac
|
关于其中字符串操作的方法:
${string#substring}:从$string左边开始,剥去最短匹配$substring子串.
${string##substring}:从$string左边开始,剥去最长匹配$substring子串.
${string%substring}:从$string结尾开始,剥去最短匹配$substring子串。
${string%%substring}:从$string结尾开始,剥去最长匹配$substring子串。
比如addr=192.168.0.234
${addr#*.} #去掉左边第一个.和其左边的*(任意字符)结果:168.0.234
${addr##*.} #去掉右边第一个.和其左边的*(任意字符)结:234
${addr%.*} #去掉右边第一个.和其右边的*(任意字符)结果:192.168.0
${addr%%.*} #去掉左边第一个.和其右边的*(任意字符)结果:192
详细请参看ABS的第9.2章操作字符串中相关内容。
里边还涉及到一些并发的部分,本来打算用mkfifo做,后来发现不能实现我的功能,相关讨论在http://bbs2.chinaunix.net/viewthread.php?tid=1351218&extra=&page=1
后来我发现,这个脚本要在子进程之间传递消息,而不是由子进程向父进程传递消息,还没有找到用fifo实现的方法,最后偷了个懒,把消息都写到文本文件当当中,再由父进程对结果进行统计。还请高人指点在进程间传递消息既然普通文本文件也可以,那用mkfifo与普通文件有什么不同吗?