忽略shell脚本输出中的错误

时间:2017-07-03 15:12:20

标签: bash shell if-statement ping dev-null

如果ICMP回送失败,我想省略此IF语句中的错误。

示例代码:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

如果ping成功或者您在脚本之外运行命令,它可以正常工作,但如果没有响应则提供以下输出。

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING NOK

我已经看到了这个引用2> / dev / null的答案,但是这会在输出中显示整个ping查询,无论是否成功!示例2> / dev / null如下。

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 26.134/26.134/26.134/0.000 ms
PING OK

这是一个n00b问题,但我是一个网络小伙伴,而不是开发人员:)

提前致谢!!

2 个答案:

答案 0 :(得分:3)

«经典»解决方案:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

从BASH 4开始,提供了一种更现代的(以及 POSIX兼容!)方法:

if ping -q -c 1 -W 1 1.2.3.4 &>/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

这两个意味着«将STDOUT和STDERR重定向到/ dev / null»,但第一个按顺序执行,首先重定向STDOUT,然后将STDERR重定向到STDOUT。

答案 1 :(得分:0)

您也可以使用退出状态 [ Check this ] ..

ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1
[ $? -eq 0 ] && echo "Ping OK" || echo "Ping NOK"