Баш сценарій відлік 5-хвилинного відображення в одному рядку [закрито]


23

Мені б хотілося, щоб у 5 хвилин було відлік часу, оновлюючись щосекунди і показуючи результат на тому ж рядку. Це можливо навіть за допомогою сценаріїв Баша?


Що робить відлік часу? Вам потрібно бути трохи більш конкретним щодо всієї справи.
— Адріан Фрюхвірт

Це абсолютно можливо. Якщо ви скажете нам, чому (яку актуальну проблему системного / мережевого адміністрування ви намагаєтеся вирішити), ми можемо сказати вам, який із багатьох доступних методів зробити це, швидше за все, буде найкращим для вас. Якщо це загальне питання "Як це зробити в 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 [ОК являє собою кінець рядка, який очищає решту рядка, якщо від попереднього виходу залишилися будь-які символи, \ r - повернення каретки, яке переміщує курсор на початок рядка. На цій сторінці є stackoverflow.com про цю функцію .

Ви можете додати власні команди чи що завгодно в циклі while. Якщо вам потрібно щось більш конкретне, будь ласка, надайте мені більше деталей.


Ви маєте на увазі \ 033 [K відповідно до ascii-table.com/ansi-escape-sequences.php замість 0K?
— Джоді Лі Брюшон

Я ставлю \rна початку, щоб поставити курсор в кінці рядка (які заважають йому приховати перший символ). Ось оновлена ​​версія: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Подяки
— користувач1067920

13

Ось один із покращенням правильного вихідного формату (HH: MM: SS) з належними провідними нулями та підтримуючими годинами:

#!/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.