#!/bin/bash
while :
do
read -p "输入要ping的网络IP前三位: " ip
#regex="\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])"
#ckStep2=`echo $ip | egrep $regex | wc -l`
#if [ $ckStep2 -eq 0 ];then
# echo "The string $IPADDR is not a correct ipaddr!!!"
#fi
##############方法2#############################
#判断输入的ip地址是否仅由数字和点组成,并将值赋给m。
#判断输入的ip地址的小数点的个数,复制给n
m=`echo $ip |sed 's/[0-9.]//g'`
n=`echo $ip |sed 's/[0-9]//g'|wc -c`
#截取ip地址的四个数字的部分,并分别复制。
n1=`echo $ip |cut -d'.' -f1`
n2=`echo $ip |cut -d'.' -f2`
n3=`echo $ip |cut -d'.' -f3`
#n4=`echo $ip |cut -d'.' -f4`
if [ ! $m = ~^[0-9] ];then
echo "The string $ip is not a correct ipaddr!!!,非纯数字"
else
#第一个if通过m和n来判断输入的ip是否符合要求
if [ -n "$m" ] || [ "$n" -ne 3 ] || [ -z "$n1" ] || [ -z "$n2" ] || [ -z "$n3" ];then
echo "The string $ip is not a correct ipaddr!!!"
else
#第二个if通过n1到n4来判断输入的范围是否符合要求。
if [ $n1 -lt 0 ] || [ $n1 -gt 255 ] || [ $n2 -lt 0 ] || [ $n2 -gt 255 ] || [ $n3 -lt 0 ] || [ $n3 -gt 255 ];then
echo "The string $IPADDR is not a correct ipaddr!!!"
else
m_ping() {
ping -c2 -i0.1 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
echo "$1 is up" >> temfile.txt
fi
}
#控制进程数量
num=50
#创建命令管道文件,并绑定文件描述符,创建其文件描述,通过重定向将数据导入管道文件
pipefile="/tmp/multiping_$$.tmp"
mkfifo $pipefile
exec 12<>$pipefile
for i in `seq $num`
do
echo "" >&12 &
done
for j in {1..254}
do
read -u12
{
m_ping $ip.$j
# echo -ne "---\r"
echo "" >&12
} &
done
wait
num=`sed -n '$=' temfile.txt`
echo "ping通数:$num"
rm -rf $pipefile
rm -rf temfile.txt
#echo "/n"
fi
fi
fi
done