Una vez más aquí. Hoy vengo a dejar un pequeño artículo sobre algo que un usuario me ha comentado hace uno o dos días. El caso es que este usuario debe estar estudiando bash, le han pedido un ejercicio en el que se muestre un temporizador de cuenta regresiva utilizando este lenguaje para scripts.
En principio le dije que iba a buscar entre los ejercicios que tengo hechos (hace ya unos cuantos años) guardados en algunos discos que tengo por aquí. Y para mi sorpresa me encontré un ejercicio que va precisamente sobre esto, de mostrar en la terminal un temporizador de cuenta regresiva. Me imagino que esto lo haría en la asignatura de Sistemas Informáticos en DAW, por que este fue la única asignatura en la que vi un poco este lenguaje.
Como decía, el código que voy a poner en este artículo tiene ya unos 11 años (aproximadamente), y por lo que he probado, tiene algunos fallos, por lo que muestra algunas cosas un poco raras, pero que se pueden solucionar de forma más o menos sencilla. Por esto, si el usuario que me preguntó por este ejercicio, o cualquier otro que lo pueda utilizar (para lo que sea), que tenga presente que debería echar un vistazo al código para afinarlo, cambiarlo o actualizarlo.
Código del temporizador de cuenta regresiva escrito en bash
Este código tan solo es necesario pegarlo dentro de un archivo llamado contador.sh. Y el código del que hablo es el siguiente:
#!/bin/bash # Mensaje de error if [ "$#" -lt "2" ] ; then echo "Haces un uso incorrecto!!" echo "Los meses deben escribirse en inglés. Un ejemplo correcto sería:" echo './contador.sh -d "12 Jan 2022 17:46"' echo 'También puedes utilizar minutos como parámetro. Un ejemplo sería:' echo './contador.sh -m 65' exit 1 fi #fecha actual pasada a seg ahora=`date +%s` #Fecha completa introducida por el usuario if [ "$1" = "-d" ] ; then fec_seg=`date -d "$2" +%s` sec_m=`expr $fec_seg - $ahora` #ERROR if [ $sec_m -lt 1 ]; then echo "La fecha $2 ya ha pasado ..." exit 1 fi fi #Minutos introducidos por el usuario if [ "$1" = "-m" ] ; then fec_seg=`expr 60 \* $2` fec_seg=`expr $fec_seg + $ahora` sec_m=`expr $fec_seg - $ahora` #ERROR if [ $sec_m -lt 1 ]; then echo "La hora $2 ya ha pasado ... Vuelve a ejecutar el script y utiliza un número entero." exit 1 fi fi #Inicio varaiables para la barra de progreso aument=0 tmp=0 colum=`tput cols` colum=$[ $colum -5 ] porcentaje=0 tiempo_total=0 #Muestra y calculo de lo que aparece en pantalla while [ $sec_m -gt 0 ]; do clear echo "Hoy es "$(date +%A)", "$(date +%d)" de "$(date +%B)" de "$(date +%Y)" a las "$(date +%H:%M:%S) let sec_m=$sec_m-1 interval=$sec_m segundos=`expr $interval % 60` interval=`expr $interval - $segundos` minutos=`expr $interval % 3600 / 60` interval=`expr $interval - $minutos` horas=`expr $interval % 86400 / 3600` interval=`expr $interval - $horas` dias=`expr $interval % 604800 / 86400` interval=`expr $interval - $horas` semanas=`expr $interval / 604800` echo "... y queda hasta la fecha:" $(date -d@$fec_seg) echo "----------------------------" echo "Segundos: " $segundos echo "Minutos: " $minutos echo "Horas: " $horas echo "Días: " $dias echo "Semanas: " $semanas #Barra de progreso echo -n "[" progreso=$[$progreso + 1] if [ $tiempo_total -lt 1 ] ; then tiempo_total=$[$horas * 3600 + $minutos * 60 + $segundos] fi printf -v f "%$(echo $aument)s>" ; printf "%s\n" "${f// /-}]" tput cup 7 $colum tmp=$porcentaje porcentaje=$[$progreso * 100 / $tiempo_total] porcentaje=$[$porcentaje] change=$[$porcentaje - $tmp] aument=$[ $colum * $porcentaje / 100 ] printf "[%d%%]" $porcentaje sleep 1 done printf "\n" echo "Programa finalizado !!!" printf "\n"
Una vez guardado el archivo en el que pegamos el anterior código, es necesario darle permisos de ejecución. En Ubuntu solo necesitaremos abrir una terminal (Ctrl+Alt+T) y escribiendo en ella el comando:
sudo chmod +x contador.sh
Como utilizar este contador
Este script es muy sencillo de utilizar. Si ejecutamos el script como se indica a continuación, el propio script nos dirá cómo debemos utilizarlo:

S./contador
Se puede ver en la captura anterior que podremos introducir una fecha y una hora con el siguiente formato:
./contador.sh -d "DIA MES(en inglés) AÑO HORAS:MINUTOS"
Si el formato es correcto, veremos algo como lo siguiente:

En caso de que queramos que el script nos calcule cuanto tiempo falta hasta que pasen un número determinado de minutos, expresados en números enteros, la sintaxis a utilizar será:
./contador.sh -m MINUTOS
El resultado que el programa nos va a mostrar será el mismo que si utilizamos la opción anterior. Pero podremos ver que la fecha hasta la que se calcula cambia:

En caso de introducir un valor no expresado en números enteros, el programa nos mostrará algo como lo siguiente:

Si introducimos una fecha correcta o si utilizamos un número entero para calcular por minutos, y el programa se ejecuta de forma normal y este llega al final, la pantalla que veremos será como la siguiente:

Y eso es todo. Como dije líneas más arriba, esto tiene ya sus años, por lo que es interesante modificarlo y corregir los errores que con el tiempo le he visto, y que cada cual lo adapte a sus necesidades. Además de aquí, el código lo voy a dejar colgado en un repositorio en GitHub.
Tengo que decir que la barra de progreso en su día recuerdo haberla tomado de algún sitio (un foro me pare recordar), pero no recuerdo el nombre. Por eso, si alguien reconoce su código y quiere comentar algo, que no dude en hacerlo.