Compte à rebours du script Bash affichage de 5 minutes sur une seule ligne [fermé]


23

Je voudrais avoir un compte à rebours de 5 minutes, mettre à jour chaque seconde et afficher le résultat sur la même ligne. Est-ce même possible avec les scripts Bash?


Que fait le compte à rebours? Vous devez être un peu plus précis sur le tout.
Adrian Frühwirth

C'est absolument possible. Si vous nous dites pourquoi (quel problème réel d'administration de système / réseau vous essayez de résoudre), nous pouvons vous dire laquelle des nombreuses méthodes disponibles pour le faire fonctionnera probablement le mieux pour vous. Si c'est une question générale "Comment faire cela dans un bashscript?", Votre question est probablement mieux adaptée à Unix et Linux - faites le moi savoir et je peux la migrer là pour vous :)
voretaq7

Réponses:


42

Cela fonctionne à partir du shell Bash:

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

Le caractère spécial \ 033 [OK représente une fin de ligne qui nettoie le reste de la ligne s'il reste des caractères de la sortie précédente et \ r est un retour chariot qui déplace le curseur au début de la ligne. Il y a un joli fil sur cette fonctionnalité sur stackoverflow.com .

Vous pouvez ajouter vos propres commandes ou quoi que ce soit dans la boucle while. Si vous avez besoin de quelque chose de plus spécifique, veuillez me fournir plus de détails.


Voulez-vous dire \ 033 [K selon ascii-table.com/ansi-escape-sequences.php au lieu de 0K?
Jody Lee Bruchon

Je mets \rau début pour mettre le curseur en fin de ligne (ce qui l'empêche de masquer le premier caractère). Voici la version mise à jour: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Merci
user1067920

13

En voici un avec une amélioration du bon format de sortie (HH: MM: SS) avec des zéros de tête appropriés et des heures de support:

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

Donne une sortie qui ressemble à ceci:

02:04:15

La sortie n'est pas tout à fait HH:MM:SS. Pour les minutes ou les secondes à un chiffre, vous pouvez voir 00:4:5.
chishaku
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.