Bash
Bash:while循環中的計時器
我的腳本中有一個 while 循環,它等待連接上線然後繼續。
#!/bin/sh while ! ping -c1 $1 &>/dev/null do echo "Ping Fail - `date`" done echo "Host Found - `date`"
重新連接需要 25 到 45 秒。我不能讓它等待超過 50 秒。限制循環工作時間的最佳解決方案是什麼?
沒有while循環:
# -W 50 = timeout after 50 seconds # -c 1 = 1 packet to be sent response="$(ping -W 50 -c 1 "$1" | grep '1 packets transmitted, 1 received')" if [ "$response" == '' ] ; then echo no response after 50 seconds else echo connected fi
一個粗略的方法是使用 bash 特殊變數 $SECONDS,它計算自 shell 啟動以來的秒數。我對腳本進行了三處更改:
- 將 sh-bang 行從 /bin/sh 更改為 /bin/bash
- 在測試中添加了第二個條件以
while
將 $SECONDS 與 50 進行比較- 引
$1
新腳本:
#!/bin/bash while ! ping -c1 "$1" &>/dev/null; [[ "$SECONDS" -lt 50 ]] do echo "Ping Fail - `date`" done echo "Host Found - `date`"
我只想指出,在
Host Found
50 秒超時的情況下,該聲明可能具有誤導性。您可以在循環後將 $SECONDS 與 50 進行比較以確定是否發生超時。這是 50 秒的粗略估計,因為可以使用 $SECONDS == 49 進入循環,然後
ping
可能需要超過一秒才能成功或失敗。