Скрипт Bash обратного отсчёта 5 минут отображается в одной строке [закрыт]

Вопрос или проблема

Я бы хотел иметь отсчет 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.

Оцените материал
Добавить комментарий

Капча загружается...