関連する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
正常に完了した場合にのみ文を実行するようですif
。nc
nc ... && if ...
0
これは出力されない理由を説明します。障害がif
発生した場合、ドアは実行されないため、ドアのブランチには常に到達できません。nc
else
if
代わりに、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
...しかし、技術的にはドアと同じではありませんif
。echo 0
次の条件が満たされると、最後のコマンドが実行されます。どちらか nc
またはecho 1
失敗します。
nc
10秒後にコマンドを終了するには、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
リセットしてください$?
。
答え2
&&
2番目の部分は、最初の部分がtrueの場合にのみ適用されます。だからあなたが持っているのはこれです
nc
効果があったので実行してみif it suceeded
てください。echo 1
nc
失敗、だからもう進まないでください。&&
私の考えであなたが望むのはこれです。
if nc -z 10.102.10.22 10003 > /dev/null; then echo 1; else echo 0; fi
答え3
他の素晴らしい答えに加えて、望む結果は終了状態の算術否定です。
nc -z 10.102.10.22 10003 > /dev/null
echo $(( ! $? ))