2017-07-03 57 views
2

如果ICMP回顯失敗,我想省略此IF語句中的錯誤。從shell腳本輸出中省略錯誤

示例代碼:

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

的«經典»解決方案:

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 

一個稍微更現代(和 POSIX兼容的!)的方式,可用自BASH 4:

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。

+2

完美!非常感謝。 –

+0

@LiamMulligan我的榮幸。不要忘記將問題標記爲已解決。 – hidefromkgb

+0

使用'&>'不是「更現代化」。這是一種違反shell標準的可怕黑客攻擊(或者至多在標準中利用模糊性)。符合posix標準的shell會將'cmd>/dev/null'解釋爲與執行cmd的cmd>/dev/null'異步,然後執行一個簡單的重定向到/ dev/null。這是一個最好避免的構造。 –

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"