条件付き 'if'コマンドはelseで応答しません。

条件付き 'if'コマンドはelseで応答しません。

関連するIPおよびポートとの通信を確認1して値を返す必要がある次のコマンドラインがあります。nc

/bin/nc -z 10.102.10.22 10003 > /dev/null && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

結果は満足で価値がありました1。ただし、そのポートやIPとの通信がないと、コマンドは「待機」状態になり、どの種類の値も取得できません。

特定の時間(例:10秒)が経過した後に0値(文)を返す正しい方法は何ですか?else

このコマンドの結果は非常に短い間隔で監視され、通信をグラフで表示するので、いつであるかを知ることは興味深いです0

ベストアンサー1

正常に完了した場合にのみ文を実行するようですifnc

nc ... && if ...

0これは出力されない理由を説明します。障害がif発生した場合、ドアは実行されないため、ドアのブランチには常に到達できません。ncelseif

代わりに、nc以下を直接使用してくださいif

if nc -z 10.102.10.22 10003 >/dev/null; then
    echo 1
else
    echo 0
fi

段落ロジックを使用して、次の特定の文を作成することもできます。

nc -z 10.102.10.22 10003 >/dev/null && echo 1 || echo 0

...しかし、技術的にはドアと同じではありませんifecho 0次の条件が満たされると、最後のコマンドが実行されます。どちらか ncまたはecho 1失敗します。

nc10秒後にコマンドを終了するには、GNUユーティリティを使用してくださいtimeout

if timeout 10 nc -z 10.102.10.22 10003 >/dev/null; then
    echo 1
else
    echo 0
fi

特殊変数$?ほとんど使用しない。 1つ以上の他のコマンドを実行した後にコマンドの終了状態を使用する必要がある場合にのみ必要です。たとえば、場合によっては、シェル関数から終了ステータスを返すとします。

myfunction () {
    grep -q 'pattern' file
    err=$?

    if [ "$err" -ne 0 ]; then
        echo failed >&2
    fi

    return "$err"
}

ここで[ ... ]テストしてechoリセットしてください$?

おすすめ記事