Bash: таймер во время цикла

Eclipse с такими плагинами, как ShellEd , действительно хороший выбор, Geany также хорошо работает.

2
31.12.2018, 17:55
2 ответа

Без цикла 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      
5
27.01.2020, 21:50

Грубый вариант — использовать специальную переменную bash $SECONDS, которая подсчитывает количество секунд с момента запуска оболочки. Я внес три изменения в скрипт:

  1. строка 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 Foundможет ввести в заблуждение в случае тайм-аута в 50 -секунд. Вы можете сравнить $SECONDS с 50 после цикла, чтобы определить, произошел ли тайм-аут.

Это приблизительная оценка в 50 секунд, так как цикл можно было ввести с $SECONDS == 49, а затем pingдля успешного или неудачного выполнения может потребоваться более одной секунды.

6
27.01.2020, 21:50

Теги

Похожие вопросы