我认为需要将其改为 while 循环,因为目前它会等待所有 10000 次 ping 完成。我需要它在 ping 成功时返回。您有什么建议?
#!/bin/bash
echo begin ping
if ping -c 100000 8.8.8.8 | grep timeout;
then echo `say timeout`;
else echo `say the internet is back up`;
fi
答案1
如果您想让它不断检查,并根据状态执行不同的操作,那么您是对的,while 循环可能是更好的选择。有很多方法可以实现这一点,下面是我想出的一个简单的示例,当然需要修改,但可以作为一个开始。
#!/bin/bash
PING="/bin/ping -q -c1"
HOST=www.google.com
WAITTIME=3
while [ true ]
do
${PING} ${HOST}
if [ $? -ne 0 ]; then
echo "Link is down"
fi
sleep $WAITTIME
done
这是一个无限循环,因为true
总是等于 true。所以它会一直运行,直到你跳出它。每次循环时,它都会 ping 变量配置的任何主机 1 次,然后检查$?
最后一个命令的返回值。如果该值不为 0,则 ping 失败,并且假设链接已断开。然后它会暂停一段时间(在本例中为 3 秒)并再次尝试,因为 true 仍然为真。
答案2
尝试这个:
#!/bin/bash
while :; do
ping -c 1 8.8.8.8 >/dev/null 2>&1
if [ $? = 0 ]; then
break
else
echo timeout
fi
sleep 1
done
echo the internet is back up
如果您想使用“say”,您只需用“echo”更改行即可。