我在想,这需要改为while子句,目前它会等到所有10000 ping完成,我需要它返回时,ping成功。OSX上的程序“说”让电脑说话。
#!/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
好吧,我没有权利回答我自己的问题,所以在玩了一圈之后,我的答案是:
谢谢,是的,我不知道$?直到现在。不管怎样,现在我已经做了这个。我喜欢你的不去永远,但在我的情况下,我不需要它停止,直到它完成。
#!/bin/bash
intertube=0
echo "begin ping"
while [ $intertube -ne 1 ]; do
ping -c 3 google.com
if [ $? -eq 0 ]; then
echo "ping success";
say success
intertube=1;
else
echo "fail ping"
fi
done
echo "fin script"
7条答案
按热度按时间umuewwlo1#
你可能不应该依赖命令的文本输出来决定这一点,* 特别是 * 当
ping
命令给你一个非常好的返回值时:如果从指定主机至少听到一个响应,则ping实用程序返回退出状态零;如果传输成功但没有接收到响应,则状态2;或者如果发生错误,则从
<sysexits.h>
获取另一个值。换句话说,使用类似于:
deikduxw2#
你不需要使用echo或grep。你可以这样做:
3b6akqbq3#
这也可以通过超时来完成:
wfsdck304#
我使用这个Bash脚本来测试OSX上每分钟的互联网状态
mzsu5hc05#
如果您使用
-o
选项,BSDping
(也在macOS上)将在收到一个回复数据包后退出。进一步阅读:https://www.freebsd.org/cgi/man.cgi?query=ping
编辑:paxdiablo很好地说明了如何利用
ping
的退出状态。我会这样做:ping
将发送最多100,000个数据包,然后以失败状态退出-除非它收到一个应答数据包,在这种情况下,它以成功状态退出。然后if
将执行相应的语句。**编辑2:**克里斯指出我的逻辑是颠倒的,这只是令人尴尬。此外,
echo
命令(从问题继承而来)没有任何用途,也没有必要特别要求bash。我对12年前的我很失望。今天我会写:9wbgstp76#
以下是我的一行程序解决方案:
这将在新的屏幕会话中运行无限ping,直到有响应为止,此时它将向
my-email@example.com
发送一封电子邮件。在电子邮件发送到手机的时代很有用。(You您可能需要先运行
echo test | mail -s test my-email@example.com
来检查mail
是否配置正确。当然,从done;
开始,你可以做任何你想做的事情,敲个铃,启动一个web浏览器,发挥你的想象力。ia2d9nvy7#
我喜欢paxdiablo的脚本,但想要一个可以无限运行的版本。此版本运行ping,直到建立连接,然后打印一条消息。
我还有一个Gist of this script,我会根据需要更新修复和改进。