Баш сценарій відлік 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.