#!/bin/bash
#ping.sh
#Auther:stone
#取起始IP
read -p "please input start IPadr:" startip
#判断输入的是否为IP地址
while :; do
echo $startip |grep -E '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' && break
read -p "please input IPadr(192.168.1.1):" startip
done
#结束IP
read -p "please input end IPadr:" endip
#判断结束IP的格式是否正确
while :; do
echo $endip |grep -E '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' && break
read -p "please input end IPadr(192.168.1.255)" endip
done
#分别将起始IP地址和结束IP地址的四段提取出来用于判断
head1=`echo $startip |cut -d . -f 1`
head2=`echo $startip |cut -d . -f 2`
head3=`echo $startip |cut -d . -f 3`
head4=`echo $startip |cut -d . -f 4`
tail1=`echo $endip |cut -d . -f 1`
tail2=`echo $endip |cut -d . -f 2`
tail3=`echo $endip |cut -d . -f 3`
tail4=`echo $endip |cut -d . -f 4`
#判断结束IP段是否大于起始IP段,有四种可能:
if [ $tail1 -lt $head1 ]; then
echo -e "\033[31mend IPadr smaller than start IPadr.\033[0m"
exit 10
fi
if [ $tail1 -lt $head1 ] && [ $tail2 -lt $head2 ]; then
echo -e "\033[31mend IPadr smaller than start IPadr.\033[0m"
exit 10
fi
if [ $tail1 -lt $head1 ] && [ $tail2 -lt $head2 ] && [ $tail3 -lt $head3 ]; then
echo -e "\033[31mend IPadr smaller than start IPadr.\033[0m"
exit 10
fi
if [ $tail1 -lt $head1 ] && [ $tail2 -lt $head2 ] && [ $tail3 -lt $head3 ] && [ $tail4 -lt $head4 ]; then
echo -e "\033[31mend IPadr smaller than start IPadr.\033[0m"
exit 10
fi
#以下为ping命令循环
while :; do
if [ $head1 -eq $tail1 ]; then
if [ $head2 -eq $tail2 ]; then
if [ $head3 -eq $tail3 ]; then
for ((d=$head4;d<=$tail4;d++)); do
ping -c 1 -W 1 $head1.$head2.$head3.$d &>/dev/null
[ $? == 0 ] && echo -e "\033[32m$head1.$head2.$head3.$d is up.\033[0m"
[ $? == 1 ] && echo -e "\033[31m$head1.$head2.$head3.$d id down.\033[0m"
done
exit 0
else
for ((d=$head4;d<=255;d++)); do
ping -c 1 -W 1 $head1.$head2.$head3.$d &>/dev/null
[ $? == 0 ] && echo -e "\033[32m$head1.$head2.$head3.$d is up.\033[0m"
[ $? == 1 ] && echo -e "\033[31m$head1.$head2.$head3.$d id down.\033[0m"
done
declare c=$head3
let c++
while (($tail3-$c>0)); do
for ((d=1;d<=255;d++)); do
ping -c 1 -W 1 $head1.$head2.$c.$d &>/dev/null
[ $? == 0 ] && echo -e "\033[32m$head1.$head2.$c.$d is up.\033[0m"
[ $? == 1 ] && echo -e "\033[31m$head1.$head2.$c.$d id down.\033[0m"
done
done
if [ `expr $tail3 - $c` -eq 0 ]; then
for ((d=0;d<=$tail4;d++)); do
ping -c 1 -W 1 $head1.$head2.$c.$d &>/dev/null
[ $? == 0 ] && echo -e "\033[32m$head1.$head2.$c.$d is up.\033[0m"
[ $? == 1 ] && echo -e "\033[31m$head1.$head2.$c.$d id down.\033[0m"
done
exit 0
fi
fi
fi
fi
done