忽略 shell 脚本输出中的错误

Lia*_*gan 3 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
Run Code Online (Sandbox Code Playgroud)

如果 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
Run Code Online (Sandbox Code Playgroud)

我已经看到了引用 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
Run Code Online (Sandbox Code Playgroud)

这是一个有点难懂的问题,但我是一个网络专家,而不是开发人员:)

提前致谢!!

hid*_*kgb 5

\xc2\xabclassic\xc2\xbb 解决方案:

\n\n
if ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1; then\n  echo -e "PING OK"\nelse\n  echo -e "PING NOK"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

一种更现代(且不符合POSIX!)的方法,自 BASH 4 起可用:

\n\n
if ping -q -c 1 -W 1 1.2.3.4 &>/dev/null; then\n  echo -e "PING OK"\nelse\n  echo -e "PING NOK"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两个都意味着 \xc2\xabredirect STDOUT 和 STDERR 到 /dev/null\xc2\xbb,但第一个是按顺序执行的,首先重定向 STDOUT,然后将 STDERR 重定向到 STDOUT。

\n

  • 完美的!非常感谢。 (2认同)