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

23

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

ptheofan
источник
Что делает обратный отсчет? Вы должны быть немного более конкретным во всем этом.
Адриан Фрувирт
Это абсолютно возможно. Если вы скажете нам, почему (какую именно проблему системного / сетевого администрирования вы пытаетесь решить), мы можем сказать вам, какой из множества доступных методов для этого, вероятно, будет работать лучше для вас. Если это общий вопрос «Как мне это сделать в bashсценарии? », То ваш вопрос, вероятно, лучше подходит для Unix и Linux - дайте мне знать, и я могу перенести его туда для вас :)
voretaq7
Вот способ github.com/himanshub16/MyScripts/blob/master/countdown.sh
Химаншу Шекхар

Ответы:

42

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

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

Специальный символ \ 033 [OK представляет конец строки, который очищает остаток строки, если после предыдущего вывода остались какие-либо символы, а \ r - возврат каретки, который перемещает курсор в начало строки. Есть хорошая тема об этой функции на stackoverflow.com .

Вы можете добавить собственные команды или что-то еще в цикле while. Если вам нужно что-то более конкретное, пожалуйста, предоставьте мне более подробную информацию.

dsmsk80
источник
Вы имеете в виду \ 033 [K согласно ascii-table.com/ansi-escape-septions.php вместо 0K ?
Джоди Ли Брухон
Я ставлю \rв начале курсор в конце строки (что мешает скрыть первый символ). Вот обновленная версия: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Спасибо
user1067920
13

Вот пример с улучшением правильного формата вывода (ЧЧ: ММ: СС) с правильными ведущими нулями и поддерживающими часами:

#!/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
Рахул
источник
Выход не совсем HH:MM:SS. Вы могли видеть однозначные минуты или секунды 00:4:5.
Чишаку