数组 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