インターネット接続を確認するスクリプトがあります。私はこれを達成するためにpingを使用します。使用するたびにping google.com -c 4 | grep time
null以外の応答が生成されます。それはまるで
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.com
IP接続と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 time
xは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 1
1バイトのデータのみが送信されます。使用すると、-c 1
1つのICMPパケットのみが送信されます。を渡して-W 2
ping応答を2秒だけ待つように指定します。