数组 bash shell

http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

 

#!/bin/bash
# 脚本检测到离线主机会发送邮件通知,可一直运行。
# 请根据你的需要设置 Mail gatewany ip lastip  四项  其余不用设置
Mail=testping123@163.com   #报警邮件接收地址
gateway=192.168.1.253   #内网网关ip  测试内网是否正常
outipaddr=202.96.134.134   #外网ip  测试外网是否正常
ip="192.168.1."
lastip=(
142
210
211
212
220
221
222
) #需要监控的主机列表 可以继续添加142 210 211 212 220 221 222
unlastip=()  #不在线主机列表
length=${#lastip[@]}       #
unlength=${#unlastip[@]}
echo "一共有$length个服务器在检测"
ps () {  #ping 在线主机列表
ping $ip$1 -c 1 -w 2 |grep -q "ttl" #最多ping2次 时间2秒内 2秒实测ping2次 ping不通2秒自动停止

if [ $? -eq 0 ];then ###
  echo "ping $ip$1 pass"   ###通
  else ###    不通
  ping $gateway -c 1 -w 2 |grep -q "ttl" #本机ping网关 测试目的:防止本机脱离局域网


 if [ $? -eq 0 ];then ## 内网通
       echo "ping $ip$1 lost" 
       ping $outipaddr  -c 2 -w 2 |grep -q "ttl" #本机ping外网
  if [ $? -eq 0 ];then # 外网通 删除离线主机  并进行邮件通知
           echo "当前不通被删除的ip为:$1"
#          echo "添加前unlastip数组值为:${unlastip[@]}"
#          echo "进行添加"
           unlastip=(${unlastip[@]}  $1) # 把离线主机添加到离线列表中
#          echo "添加成功"
           unset lastip[i]   #从数组中删除离线ip   不过echo  lastip[i]的值为空  需要做以下操作
           echo "当前离线主机列表:${unlastip[@]}"
           m=${lastip[@]}
           lastip=($m)            #删除后剩余数组内容重新赋值给数组
           echo "当前在线主机列表:${lastip[@]}"

                length=${#lastip[@]}       #
                unlength=${#unlastip[@]}       #
 #    fi
            echo `date`|mail -s "$ip$1 lost" $Mail ##发邮件提醒断网时间
            echo "******************* mail sent ************************"
            else #  发送不成功
            echo "sent mail failed,please check"

   fi #

     else ##  内网不通
      echo "can't reach the gateway ,please check inet "
 #     continue
 fi ##


fi ###
}


pu () {  #ping离线主机列表
ping $ip$1 -c 1 -w 2 |grep -q "ttl" #最多ping2次 时间2秒内 2秒实测ping2次 ping不通2秒自动停止
if [ $? -eq 0 ];then ###  列表中为不通的ip   这里判断是否又通了
   echo "进行添加"
   lastip=(${lastip[@]}  $1)
   echo "添加成功"
   unset unlastip[j]   #从数组中删除原数   
   echo "当前在线主机列表:${lastip[@]}"
   m=${unlastip[@]}
   unlastip=($m)            #删除后剩余数组内容重新赋值给数组
   echo "当前不在线主机列表${unlastip[@]}"
   unlength=${#unlastip[@]}       #
   length=${#lastip[@]}       #

fi




}
while :;do # 死循环
#改进后循环,unset${lastip[i]}删除数组中ping不通的ip
  if (($length>0));then #  在线主机列表非空就检查列表中主机是否真的在线,如果不在线 ps函数将会把离线主机踢出在线列表
    for ((i=0;i<$length;i++));do
#echo ${lastip[i]}
    ps ${lastip[i]}
#exit
    done
  fi
#改进前的循环,无法删除数组原数
#for i in ${lastip[*]};do # 循环ip列表
#ps $i   # $i就是ps里面的$1
#echo "sum:"$sum
#done
#echo $unlength

sleep 1

#echo "ps over and  pu start"
  if (($unlength>0));then  # 有离线主机就开始检查离线主机是否恢复在线,pu函数将对恢复在线的主机添加到在线主机列表中
     for ((j=0;j<$unlength;j++));do
         pu  ${unlastip[j]}
     done
  fi
#  echo "pu over and ps start"

   echo "当前在线主机列表:${lastip[@]}"

   echo "当前不在线主机列表${unlastip[@]}"

done

 

posted on 2015-04-20 19:07  寒星12345678999  阅读(181)  评论(0编辑  收藏  举报