http://pastebin.com/raw.php?i=rykHdvBh
bix.hu 和 www.yahoo.com 是“可 ping 通”的测试站点。
无法 ping 通 127.0.0.1 [防火墙丢弃所有 icmp]
我有一个“oneliner”,它会回显是否有“互联网连接”。
$ ping -W 1 -c 2 bix.hu >& /dev/null && ping -W 1 -c 2 www.yahoo.com >& /dev/null && echo "internet connection ok" || echo "no internet connection"
internet connection ok
$ ping -W 1 -c 2 127.0.0.1 >& /dev/null && ping -W 1 -c 2 www.yahoo.com >& /dev/null && echo "internet connection ok" || echo "no internet connection"
no internet connection
$ ping -W 1 -c 2 127.0.0.1 >& /dev/null && ping -W 1 -c 2 127.0.0.1 >& /dev/null && echo "internet connection ok" || echo "no internet connection"
no internet connection
$ ping -W 1 -c 2 bix.hu >& /dev/null && ping -W 1 -c 2 127.0.0.1 >& /dev/null && echo "internet connection ok" || echo "no internet connection"
no internet connection
$ ping -W 1 -c 2 bix.hu >& /dev/null && ping -W 1 -c 2 www.yahoo.com >& /dev/null && echo "internet connection ok" || echo "no internet connection"
internet connection ok
$
好的!
但是:如果我希望“oneliner”仅在有互联网连接时运行:
$ while $TORF; do ping -W 1 -c 1 bix.hu >& /dev/null && ping -W 1 -c 1 www.yahoo.com >& /dev/null && TORF=false || TORF=true; done
$ while $TORF; do ping -W 1 -c 1 127.0.0.1 >& /dev/null && ping -W 1 -c 1 www.yahoo.com >& /dev/null && TORF=false || TORF=true; done
$ while $TORF; do ping -W 1 -c 1 127.0.0.1 >& /dev/null && ping -W 1 -c 1 127.0.0.1 >& /dev/null && TORF=false || TORF=true; done
$ while $TORF; do ping -W 1 -c 1 bix.hu >& /dev/null && ping -W 1 -c 1 127.0.0.1 >& /dev/null && TORF=false || TORF=true; done
$ while $TORF; do ping -W 1 -c 1 bix.hu >& /dev/null && ping -W 1 -c 1 www.yahoo.com >& /dev/null && TORF=false || TORF=true; done
$
它就行不通。
目标:如果没有互联网连接,那么 oneliner 必须循环,直到有互联网连接。如果有互联网连接,oneliner 结束。
我遗漏了什么?
答案1
设置 TORF 变量在子 shell 中有效,不会传递到当前 shell。您可以尝试不使用变量的操作:
while true; do ping -W 1 -c 1 bix.hu >/dev/null && ping -W 1 -c 1 www.yahoo.com >/dev/null && continue; break; done
等到有互联网连接(至少有一个站点响应):
while true; do (ping -W 1 -c 1 bix.hu >/dev/null || ping -W 1 -c 1 www.yahoo.com >/dev/null) && break; done