Назад | Перейти на главную страницу

Сценарий Bash обратный отсчет 5 минут отображается в одной строке

Я хотел бы отсчет 5 минут, обновлять каждую секунду и отображать результат в той же строке. Возможно ли это вообще с помощью сценариев Bash?

Это работает из оболочки Bash:

secs=$((5 * 60))
while [ $secs -gt 0 ]; do
   echo -ne "$secs\033[0K\r"
   sleep 1
   : $((secs--))
done

Особый персонаж \ 033 [0K представляет конец строки, которая очищает оставшуюся часть строки, если от предыдущего вывода остались какие-либо символы и - возврат каретки, перемещающий курсор в начало строки. Есть хорошая ветка об этой функции на 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