Bash

帶有在 else 中不響應的命令的條件 if

  • March 17, 2021

我有以下命令行,1如果通過nc檢查與相關 IP 和埠的通信,它應該返回值:

/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

&&如果第一部分為真,則僅適用第二部分。所以你有的是這個

  • nc成功,所以執行if it suceeded(它做了)echo 1
  • nc失敗,所以不要越過&&

我想你想要的是這個

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

如果成功完成,您似乎只執行該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如果其中一個 ncecho 1失敗,則最後一個命令將執行。

要讓nc命令在 10 秒後退出,請使用 GNU 實用程序timeout

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

特殊變數$?很少使用。只有在需要在一個或多個其他命令執行之後才需要使用某個命令的退出狀態的情況下才需要它。例如,在某些情況下從 shell 函式返回退出狀態時:

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

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

   return "$err"
}

這裡是[ ... ]test 和echoresets $?

引用自:https://unix.stackexchange.com/questions/639726