我想在我的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
我现在非常困难,因为我的剧本技巧很糟糕。
答案 0 :(得分:1)
代码中有两个错误:
if [$? -eq 0]; then
应为if [ $? -eq 0 ]; then
完成前fi
应移至for循环之外。
示例:
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
建议的改进:
双重引用您的变量是一种很好的做法
使用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