經過各位老板的指點我修改了部分內容使其更加完善 原文鏈接 http://www.www58058.com/70381
/bin/bash
declare -i Inet
declare -i Snet
[[ $1 =~ ((2[0-4][0-9]|25[0-5]|1?[0-9]?[0-9])\.){3}(2[0-4][0-9]|25[0-5]|1?[0-9]?[0-9])\/(2[4-9]|3[0-2]) ]] #正則表達式驗證是否為正確格式
if [ $? -ne 0 ] ;then #判斷格式是否配正確匹配
{
echo ” Usage:$0 172.18.0.0/24-32.” #如果格式未被正確匹配返回250狀態碼,并提示使用方法
exit 250
}
fi
Inet=`echo “$1″ | cut -d”.” -f4 | cut -d”/” -f1` #獲取Ip地址位
Iseg=`echo “$1″ | cut -d”/” -f2` #獲取子網掩碼位
Ipv4=`echo “$1″ | cut -d”.” -f1,2,3` #獲取主機位
let Smask=32-$Iseg #計算子網掩碼反掩碼位數
Sips=$[2**$Smask] #計算出指定網絡的IP數
Snet=$[ $Inet + $Sips -1 ] #從指定主機數到輸出的主機個數
[ $Snet -gt 255 ] && Sips=$[ 256 – $Inet ] && Shosts=255 || Shosts=$[ $Inet + $Sips -1 ]
echo “反向子網掩碼位為:$Smask” #輸出反掩碼位數
echo “要查找的地址數為:$Sips” #輸出主機個數
echo “子網掩碼的位數為:$Iseg” #輸出子網掩碼
echo “Ipv4的首個地址為:${Ipv4}.$Inet” #輸出網絡地址位
echo “查看的網段地址為:${Ipv4}.${Inet}-${Ipv4}.${Shosts}” #輸出匹配的網絡位
if [ $Snet -gt 255 ] ;then #當地址數溢出時的補救措施
{
Snet=255 #主機數強制為255個
}
fi
for i in `seq $Inet $Snet`; #for循環從指定主機開始到指定網段結束的IP個數
do
ping -c1 -W1 $Ipv4.$i >/dev/null 2>&1 && echo -e “\033[32m$Ipv4.$i is \tup \033[0m” || echo -e “$Ipv4.$i is\033[31m \tdown \033[0m”
read -dq -s -t 1 wode && exit #read接受到用戶輸入的q后終止循環并退出腳本
#ping 判斷主機是在線還是 不在線
done
unset Inet Iseq Ipv4 wjy Smask Sips Snet wode #釋放上邊使用到的變量
上個版本最大的問題是 只要腳本開始就無法終止腳本 現在按q鍵可以快退出腳本
正則表達式匹配也不規范 顯示的網段和主機個數也有問題
這個腳本適合用子網掩碼進行劃分過的網絡 可以指定任意網段的以子網掩碼進行劃分的主機
原創文章,作者:wode,如若轉載,請注明出處:http://www.www58058.com/71409