3

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

これは少し未熟な質問ですが、私は開発者ではなく、ネットワーク チャップです :)

前もって感謝します!!

4

2 に答える 2

4

«クラシック» ソリューション:

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 にリダイレクトして、順番に実行します。

于 2017-07-03T15:17:59.957 に答える
0

終了ステータス[これをチェック]も使用できます。

ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1
[ $? -eq 0 ] && echo "Ping OK" || echo "Ping NOK"
于 2017-07-03T15:22:40.187 に答える