Bash

Bash:while循環中的計時器

  • December 31, 2018

我的腳本中有一個 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 啟動以來的秒數。我對腳本進行了三處更改:

  1. 將 sh-bang 行從 /bin/sh 更改為 /bin/bash
  2. 在測試中添加了第二個條件以while將 $SECONDS 與 50 進行比較
  3. $1

新腳本:

#!/bin/bash

while ! ping -c1 "$1" &>/dev/null; [[ "$SECONDS" -lt 50 ]]
       do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"

我只想指出,在Host Found50 秒超時的情況下,該聲明可能具有誤導性。您可以在循環後將 $SECONDS 與 50 進行比較以確定是否發生超時。

這是 50 秒的粗略估計,因為可以使用 $SECONDS == 49 進入循環,然後ping可能需要超過一秒才能成功或失敗。

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