Inicio Apuntes FP Temporizador de cuenta regresiva, ejercicio en Bash
about cuenta regresiva en bash

Temporizador de cuenta regresiva, ejercicio en Bash

Un ejercicio para jugar un poco con date

por entreunosyceros

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:

contador uso incorrecto
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:

Cuenta regresiva con fecha

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:

contador con minutos

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

error de minutos

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:

programa finalizado

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.


También te puede interesar ...

Deja tu comentario

* Al utilizar este formulario, acepta que este sitio web almacene y maneje sus datos.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.