我有这个脚本来检查互联网连接。我用 ping 来实现。每当我使用ping google.com -c 4 | grep time
它时,它都会产生非空响应。就像是
64 bytes from hkg03s11-in-f4.1e100.net (173.194.127.68): icmp_req=2 ttl=52 time=90.6 ms
。但是,当连接断开时,该time
部分不会显示,因此,当我执行相同的命令时,它显示为空。我该如何使用if
它?我很困惑是否使用" "
或""
。
我该使用哪一个?
if [ 'ping google.com -c 4 | grep time' != " " ]; then
或者
if [ 'ping google.com -c 4 | grep time' != "" ]; then
注意之间的空间""
答案1
[ … != " " ]
将左侧与包含单个空格的字符串进行比较。[ … != "" ]
将左侧与空字符串进行比较。 Shell 编程有一些奇怪的地方和陷阱,但这个特殊情况很简单。
'ping google.com -c 4 | grep time'
是一个 32 个字符的字符串。您可能打算使用命令的输出,即命令替换。您可以使用反引号(而不是您使用的正引号),或者使用美元括号,这在某些复杂情况下更具可读性且不易出错。无论哪种方式,您都需要将整个内容用双引号括起来,否则命令替换的结果将是分裂成文字和进一步的肮脏。
if [ "$(ping google.com -c 4 | grep time)" != "" ]; then …
所有这些都是一种相当迂回、脆弱的测试连接性的方法。使用返回状态来ping
代替。单个数据包可能就足够了,您应该指定一个相当小的超时,以防网络出现故障。 Pinggoogle.com
测试 IP 连接和 DNS 是否正常工作。您可以 ping8.8.8.8
测试 IPv4 连接是否正常工作(8.8.8.8 是 Google 运行的服务器)。
if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
echo "The network is up"
else
echo "The network is down"
fi
答案2
怎么样
if ping google.com -c 4
then
... OK
else
... not OK
fi
与大多数 UNIX 命令一样, ping 会给出一个可以测试的返回代码。
要回答原始问题,您不能直接写入空字符串,您应该使用
if [ x'ping google.com -c 4 | grep time' != x ]; then
- 如果
ping google.com -c 4 | grep time
给定空字符串 x 将等于 x
答案3
在您提供的两种选择之间,后一种是正确的:
if [ 'ping google.com -c 4 | grep time' != "" ]; then
您可以存储something
到一个变量,例如var
,并使用 检查它是否为空[ -z "$var ]"
。如果它为空,则其退出状态$?
为零。
查看:
$ var="something"
$ [ -z "$var" ]
$ echo $?
1
$ var=""
$ [ -z "$var" ]
$ echo $?
0
您可以测试互联网连接,您可以使用以下一种方法:
ping -s 1 -c 1 -W 2 -q www.google.com && echo "SUCCESS" || echo "FAILURE"
使用 时-s 1
,我们将仅发送 1 个字节的数据。使用 时-c 1
,我们将仅发送一个 ICMP 数据包。通过-W 2
,我们指定只等待 2 秒即可获得 ping 响应。