一个接一个地ping一个设备并检查可用性

时间:2015-05-24 14:49:08

标签: bash if-statement for-loop raspberry-pi sendmail

我想在我的raspi上运行一个bash脚本。 该脚本的目的是检查网络中的一个设备的可用性(使用ping)。

如果此设备正在响应,则脚本应该结束。 如果它没有响应,它必须更进一步检查3个特定设备的可用性:如果该3的一个设备正在响应,则发送邮件;如果这些设备都没有响应,则不执行任何操作。

我希望到目前为止我已经知道了:

#!/bin/bash

array=(192.168.xxx.xxx 192.168.xxx.xxx)
ping -c 1 192.168.xxx.xxx

if [$? -eq 0]; then exit 0
else

for devices in "${array[@]}"

do ping -c 1 $devices &> /dev/null

   if [ $? -eq 0 ]; then exit 0

   fi
fi

done

/usr/sbin/sendmail foo@bar.com < /home/pi/scripts/email.txt

我现在非常困难,因为我的剧本技巧很糟糕。

2 个答案:

答案 0 :(得分:1)

代码中有两个错误:

  1. if [$? -eq 0]; then应为if [ $? -eq 0 ]; then

  2. 完成前fi应移至for循环之外。

  3. 示例:

    array=(192.168.xxx.xxx 192.168.xxx.xxx)
    ping -c 1 192.168.xxx.xxx
    
    if [ $? -eq 0 ]; then 
        exit 0
    else
        for devices in "${array[@]}";do 
            ping -c 1 $devices &> /dev/null
            if [ $? -eq 0 ]; then
                exit 0
            fi
        done
    fi
    

    建议的改进:

    1. 双重引用您的变量是一种很好的做法

    2. 使用if [[ $? -eq 0 ]]; then优于bash中的if [ $? -eq 0 ]; then

答案 1 :(得分:1)

一些意见:

#!/bin/bash

array=(192.168.xxx.xxx 192.168.xxx.xxx)
# a way to simplify first if:
ping -c 1 192.168.xxx.xxx && exit 0

for devices in "${array[@]}"; do

  # you want send mail if ping is ok
  if ping -c 1 $devices &> /dev/null; then
     /usr/sbin/sendmail foo@bar.com < /home/pi/scripts/email.txt
     exit 0
  fi
done