Bash script cuenta regresiva 5 minutos de visualización en una sola línea [cerrado]

23

Me gustaría tener una cuenta regresiva de 5 minutos, actualizando cada segundo y mostrando el resultado en la misma línea. ¿Es esto posible con las secuencias de comandos Bash?

ptheofan
fuente
¿Qué hace la cuenta regresiva? Debes ser un poco más específico sobre todo el asunto.
Adrian Frühwirth
Esto es absolutamente posible. Si nos dice por qué (qué problema de administración de red / sistema real está tratando de resolver), podemos decirle cuál de los muchos métodos disponibles para hacerlo probablemente funcionará mejor para usted. Si se trata de una bashpregunta general de "¿Cómo hago esto en un script?", Su pregunta probablemente sea más adecuada para Unix y Linux ; avíseme y puedo
migrarla
Aquí hay una manera github.com/himanshub16/MyScripts/blob/master/countdown.sh
Himanshu Shekhar

Respuestas:

42

Esto funciona desde el shell Bash:

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

El carácter especial \ 033 [OK representa un final de línea que limpia el resto de la línea si quedan caracteres de la salida anterior y \ r es un retorno de carro que mueve el cursor al comienzo de la línea. Hay un buen hilo sobre esta característica en stackoverflow.com .

Puede agregar comandos propios o lo que sea en el bucle while. Si necesita algo más específico, proporcione más detalles.

dsmsk80
fuente
¿Te refieres a \ 033 [K según ascii-table.com/ansi-escape-sequences.php en lugar de 0K?
Jody Lee Bruchon
Puse \ral principio para poner el cursor al final de la línea (lo que evita que oculte el primer carácter). Aquí está la versión actualizada: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Gracias
usuario1067920
13

Aquí hay uno con una mejora del formato de salida correcto (HH: MM: SS) con ceros iniciales adecuados y horas de soporte:

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

Da un resultado que se ve así:

02:04:15
RAHAL
fuente
La salida no es del todo HH:MM:SS. Para minutos o segundos de un solo dígito, puede ver 00:4:5.
chishaku