Bashスクリプトでコマンド結果を確認する

Bashスクリプトでコマンド結果を確認する

現在、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 ipIPドメインの代わりに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

関連情報