シェルスクリプト:何もないものと比較しますか?

シェルスクリプト:何もないものと比較しますか?

インターネット接続を確認するスクリプトがあります。私はこれを達成するためにpingを使用します。使用するたびにping google.com -c 4 | grep timenull以外の応答が生成されます。それはまるで 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

[ … != " " ]左を単一のスペースを含む文字列と比較します。[ … != "" ]左側を空の文字列と比較します。シェルプログラミングにはいくつかの欠点と問題がありますが、この特別なケースは非常に簡単です。

'ping google.com -c 4 | grep time'32文字の文字列です。おそらくコマンドの出力を使用しようとしています。コマンドの置き換え。 (使用済みの前の引用符の代わりに)バックティックを使用するか、ドル角かっこを使用できます。これは、いくつかの複雑な状況ではより読みやすく、エラーの可能性が低い。どちらにしても、内容全体を二重引用符で囲む必要があります。それ以外の場合、コマンドの置換結果は次のようになります。馬で割れて、さらに汚れ

if [ "$(ping google.com -c 4 | grep time)" != "" ]; then …

これらすべては、接続性をテストするためのやや迂回的で脆弱な方法です。代わりに返品ステータスを使用してくださいping。単一のパケットで十分である可能性があるため、ネットワークに障害が発生した場合に備えて、非常に短い時間制限を指定する必要があります。 Pingはgoogle.comIP接続とDNSが正しく機能しているかどうかをテストします。 pingを使用してIPv4接続が機能しているかどうかをテストできます8.8.8.8(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

また、見ることができますシェルスクリプト:インターネット接続を確認する正しい方法は何ですか?

答え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 timexはxに等しくなります。

答え3

あなたが提供した2つの選択肢のうち、後者は正しいです。

if [ 'ping google.com -c 4 | grep time' != "" ]; then

somethingたとえば、変数に保存してvarを使用して、変数が空であることを確認できます[ -z "$var ]"。空の場合、終了ステータス$?は0です。

確認する:

$ 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 11バイトのデータのみが送信されます。使用すると、-c 11つのICMPパケットのみが送信されます。を渡して-W 2ping応答を2秒だけ待つように指定します。

関連情報