Skrypt Bash odlicza 5 minut wyświetlania w jednym wierszu [zamknięte]

23

Chciałbym mieć odliczanie 5 minut, aktualizując co sekundę i pokazując wynik w tej samej linii. Czy jest to w ogóle możliwe dzięki skryptom Bash?

ptheofan
źródło
Co robi odliczanie? Musisz być bardziej szczegółowy w tej sprawie.
Adrian Frühwirth,
Jest to absolutnie możliwe. Jeśli powiesz nam, dlaczego (jaki faktyczny problem z administrowaniem systemem / siecią próbujesz rozwiązać), możemy powiedzieć, która z wielu dostępnych metod, aby to zrobić, będzie dla Ciebie najlepsza. Jeśli jest to ogólne bashpytanie „Jak to zrobić w skrypcie?” Pytanie, które prawdopodobnie lepiej pasuje do systemów Unix i Linux - daj mi znać i mogę je dla ciebie
zmigrować

Odpowiedzi:

42

Działa to z powłoki Bash:

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

Znak specjalny \ 033 [OK oznacza koniec linii, który czyści resztę linii, jeśli pozostały jakieś znaki z poprzedniego wyjścia, a \ r jest znakiem powrotu karetki, który przesuwa kursor na początek linii. Jest ładny wątek na temat tej funkcji na stackoverflow.com .

Możesz dodać własne polecenia lub cokolwiek w pętli while. Jeśli potrzebujesz czegoś bardziej szczegółowego, podaj mi więcej szczegółów.

dsmsk80
źródło
Czy masz na myśli \ 033 [K as ascii-table.com/ansi-escape-sequences.php zamiast 0K?
Jody Lee Bruchon
Umieszczam \rna początku, aby umieścić kursor na końcu linii (co uniemożliwia mu ukrycie pierwszego znaku). Oto zaktualizowana wersja: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Dzięki
użytkownik1067920
13

Oto poprawa właściwego formatu wyjściowego (GG: MM: SS) z odpowiednimi zerami wiodącymi i godzinami obsługi:

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

Daje wynik, który wygląda następująco:

02:04:15
rahuL
źródło
Wynik nie jest całkiem HH:MM:SS. Przez jedną cyfrę minut lub sekund można było zobaczyć 00:4:5.
chishaku