現在、Advanced Bash Scripting Guideを読んでいます。私のコンピュータで正しく動作しないいくつかのスクリプトがあります。
HNAME=news-15.net # Notorious spammer.
# HNAME=$HOST
# Debug: test for localhost.
count=2 # Send only two pings.
if [[ `ping -c $count "$HNAME"` ]]
then
echo ""$HNAME" still up and broadcasting spam your way."
else
echo ""$HNAME" seems to be down. Pity."
fi
$HNAME" still up and broadcasting spam your way.
IPアドレスが存在しない場合でも常に印刷されます。誰かが問題が何であるかを明確にすることはできますか?
IPアドレスの代わりにホスト名を使用すると正常に動作します。
答え1
if [[ `ping -c $count "$HNAME"` ]]
これはping
コマンドオーバーライドで機能します(sanerではなく古いバックティック構文を使用$(...)
)。生成された出力をコマンドラインに入れ、出力が空であるかどうかを[[ .. ]]
テストします。 (つまり、通常の出力です。コマンド置換は、スクリプトのエラー出力に送信され続けるエラー出力をキャプチャしません。)
何も出力されない場合、ping
テストは成功したものです。私のシステムの例は次のとおりです。
$ ping -c1 1.2.3.4 2>/dev/null
PING 1.2.3.4 (1.2.3.4) 56(84) bytes of data.
--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
1.2.3.4
有効なIPアドレスなので接続しping
てみてください。 IPアドレスが無効な場合、またはホスト名が存在しない場合は、エラーのみを印刷し、標準出力は空です。
ホストが起動しているかどうかをテストするより良い方法は、終了ステータスをテストしてping
出力をリダイレクトすることです。
host=1.2.3.4
if ping -c1 "$host" >/dev/null 2>&1; then
echo "'$host' is up"
else
echo "'$host' does not respond (or invalid IP address/hostname)"
fi
コマンドの引用符はecho
閉じています。
echo ""$HNAME" seems to be down."
これには、引用符付きの空の文字列""
、引用符で囲まれていないパラメータ拡張、引用符付き$HNAME
文字列があります" seems to be down."
。いくつかの理由で、すべての引数拡張を引用するのが最善です。したがって、出力の変数の周りに引用符を追加するには、"$var blahblah"
またはを使用します。"\"$var\" blahblah"
望むより:
答え2
あなたの質問で述べたようにeven with nonexistent ip
。IP
ドメインの代わりにpingをする場合。必要な結果を得るには、次の方法を試してください。
HNAME=192.168.1.21
count=2 # Send only two pings.
if ping -c $count "$HNAME" 2> /dev/null
then
echo "\"$HNAME\" still up and broadcasting spam your way."
else
echo "\"$HNAME\" seems to be down. Pity."
fi