Conto alla rovescia dello script Bash visualizzato 5 minuti su una riga singola [chiuso]


23

Vorrei un conto alla rovescia di 5 minuti, aggiornando ogni secondo e mostrando il risultato sulla stessa riga. Questo è possibile anche con gli script di Bash?


Cosa fa il conto alla rovescia? Devi essere un po 'più specifico sull'intera faccenda.
Adrian Frühwirth,

Questo è assolutamente possibile. Se ci dici perché (quale problema di amministrazione di sistema / rete stai cercando di risolvere) possiamo dirti quale dei molti metodi disponibili per farlo probabilmente funzionerà meglio per te. Se si tratta di una bashdomanda generale "Come posso fare in uno script?", La tua domanda è probabilmente più adatta a Unix e Linux - fammi sapere e posso
migrarla

Risposte:


42

Funziona dalla shell Bash:

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

Il carattere speciale \ 033 [OK rappresenta una fine della riga che pulisce il resto della riga se sono rimasti caratteri dall'output precedente e \ r è un ritorno a capo che sposta il cursore all'inizio della riga. C'è un bel thread su questa funzione su stackoverflow.com .

È possibile aggiungere i propri comandi o qualunque cosa nel ciclo while. Se hai bisogno di qualcosa di più specifico, forniscimi maggiori dettagli.


Intendi \ 033 [K secondo ascii-table.com/ansi-escape-sequences.php invece di 0K?
Jody Lee Bruchon,

Ho messo \rall'inizio per posizionare il cursore alla fine della riga (che gli impedisce di nascondere il primo carattere). Ecco la versione aggiornata: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Grazie
user1067920

13

Eccone uno con un miglioramento del giusto formato di output (HH: MM: SS) con zeri iniziali e orari di supporto adeguati:

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

Fornisce un output simile al seguente:

02:04:15

L'output non è abbastanza HH:MM:SS. Per minuti o secondi a una cifra, potresti vedere 00:4:5.
Chishaku,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.