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


23

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


Что делает обратный отсчет? Вы должны быть немного более конкретным во всем этом.
Адриан Фрувирт

Это абсолютно возможно. Если вы скажете нам, почему (какую именно проблему системного / сетевого администрирования вы пытаетесь решить), мы можем сказать вам, какой из множества доступных методов для этого, вероятно, будет работать лучше для вас. Если это общий вопрос «Как мне это сделать в bashсценарии? », То ваш вопрос, вероятно, лучше подходит для Unix и Linux - дайте мне знать, и я могу перенести его туда для вас :)
voretaq7

Ответы:


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. Если вам нужно что-то более конкретное, пожалуйста, предоставьте мне более подробную информацию.


Вы имеете в виду \ 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.
Чишаку
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.