Вопрос или проблема
Я бы хотел иметь отсчет 5 минут, обновляясь каждую секунду и показывая результат на той же строке. Возможно ли это с помощью Bash-скриптинга?
Это подходит для Bash или busybox shell:
secs=$((5 * 60))
while [ $secs -gt 0 ]; do
echo -ne "$secs\033[0K\r"
sleep 1
: $((secs--))
done
Специальный символ \033[0K представляет собой конец строки, который очищает оставшуюся часть строки, если есть символы, оставшиеся от предыдущего вывода, а \r – это возврат каретки, который перемещает курсор в начало строки. На stackoverflow.com есть хорошая тема об этой функции.
Вы можете добавить свои команды или что угодно в цикл while. Если вам нужно что-то более конкретное, пожалуйста, предоставьте мне больше информации.
Вот один из вариантов с улучшением формата вывода (ЧЧ:ММ:СС) с правильными начальными нулями и поддержкой часов:
#!/bin/bash
m=${1}-1 # add minus 1
Floor () {
DIVIDEND=${1}
DIVISOR=${2}
RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
echo ${RESULT}
}
Timecount(){
s=${1}
HOUR=$( Floor ${s} 60/60 )
s=$((${s}-(60*60*${HOUR})))
MIN=$( Floor ${s} 60 )
SEC=$((${s}-60*${MIN}))
while [ $HOUR -ge 0 ]; do
while [ $MIN -ge 0 ]; do
while [ $SEC -ge 0 ]; do
printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
SEC=$((SEC-1))
sleep 1
done
SEC=59
MIN=$((MIN-1))
done
MIN=59
HOUR=$((HOUR-1))
done
}
Timecount $m
Вывод выглядит так:
02:04:15
Ответ или решение
Закрытые вопросы на форумах, таких как ServerFault, оставляют недостаточно информации для получения ответов. Тем не менее, можно предложить технически грамотное решение проблемы, представленной в вопросе, даже без дополнительных комментариев. Рассмотрим задачу, касающуюся создания обратного отсчета на 5 минут, отображаемого в одной строке с обновлением каждую секунду, с использованием Bash скрипта.
Как создать сценарий обратного отсчета с Bash
Шаг 1: Предварительная настройка переменной времени
Начнем с задания переменной, представляющей общее количество времени в секундах:
secs=$((5 * 60))
Это просто перевод 5 минут в секунды, что в результате дает 300 секунд.
Шаг 2: Основной цикл
Теперь необходимо создать цикл while
, который будет выполняться до тех пор, пока переменная secs
не достигнет нулевого значения:
while [ $secs -gt 0 ]; do
Шаг 3: Вывод времени в одной строке
Для того чтобы обновлять строку и избегать захламления вывода, используется следующая команда:
echo -ne "$secs\033[0K\r"
Здесь \033[0K
очищает строку справа от курсора, а \r
возвращает курсор к началу линии.
Шаг 4: Пауза и декремент
После вывода времени нужно приостановить выполнение скрипта на одну секунду и уменьшить значение счетчика:
sleep 1
: $((secs--))
Запись : $((secs--))
служит простой командой, декрементирующей secs
.
Заключение
При необходимости форматирования времени в виде HH:MM:SS
, можно использовать улучшенный скрипт, представленный ниже. Он включает функцию Timecount
, которая грамотно обрабатывает время с использованием арифметических операций и предоставляет форматированный вывод.
#!/bin/bash
m=${1}-1
Floor () {
DIVIDEND=${1}
DIVISOR=${2}
RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
echo ${RESULT}
}
Timecount(){
s=${1}
HOUR=$( Floor ${s} 60/60 )
s=$((${s}-(60*60*${HOUR})))
MIN=$( Floor ${s} 60 )
SEC=$((${s}-60*${MIN}))
while [ $HOUR -ge 0 ]; do
while [ $MIN -ge 0 ]; do
while [ $SEC -ge 0 ]; do
printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
SEC=$((SEC-1))
sleep 1
done
SEC=59
MIN=$((MIN-1))
done
MIN=59
HOUR=$((HOUR-1))
done
}
Timecount $m
Эта версия скрипта предоставляет более полный контроль над форматированием времени, включая обработку часов, минут и секунд с ведущими нулями. Использование таких решений не только улучшает читаемость кода, но и демонстрирует профессиональный подход к решению задач.
Следуя данным рекомендациям, можно легко добиться требуемого результата и обеспечить корректное выполнение сценария обратного отсчета времени в терминале Linux или Unix.