Shell 脚本:将某物与无物进行比较?

Shell 脚本:将某物与无物进行比较?

我有这个脚本来检查互联网连接。我用 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

也可以看看Shell 脚本:检查互联网连接的正确方法?

答案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 响应。

相关内容