Bash帶有在 else 中不響應的命令的條件
帶有在 else 中不響應的命令的條件 if
我有以下命令行,
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
如果其中一個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
特殊變數
$?
很少使用。只有在需要在一個或多個其他命令執行之後才需要使用某個命令的退出狀態的情況下才需要它。例如,在某些情況下從 shell 函式返回退出狀態時:myfunction () { grep -q 'pattern' file err=$? if [ "$err" -ne 0 ]; then echo failed >&2 fi return "$err" }
這裡是
[ ... ]
test 和echo
resets$?
。