Programación de una agenda sencilla
En sistemas UNIX, cuando estamos programando, es habitual el uso de librerías, que utiliza el programa principal, para ejecutar el código. La creación de estas librerías son fundamentales para agilizar tareas repetitivas y que el código del programa nos quede más limpio sin tener que validar cada argumento en este.
Vamos a programar una sencilla agenda con programación shell scripting. Para ello crearemos una librería en la incluiremos las validaciones de los datos que introduzcamos para dar de alta un nuevo registro. Luego crearemos el programa principal, lo ejecutaremos y probaremos todas las opciones.
Si quieres saber como funciona el sistema puedes empezar por lo más básico en este enlace donde encontrarás varios artículos relacionados con el shell scripting.
Veremos el código y al final del post aportaré los dos ficheros completos para solo copiar y pegar. Vamos a ello.
Sumario
- Creación de la librería
- Validación de los argumentos
- Programa principal
- Dar permisos de ejecución
- Ejecución del programa
- Código del programa
Creación de la librería
Creamos, con el editor que más nos guste un fichero al que llamaremos «libreria.sh». Podemos crearlo con el comando touch y editándolo después o abriendo un fichero en blanco con nano, vi, vim, etc…
toch libreria.sh nano librería.sh
Validación de los argumentos
Para hacer estas validaciones vamos a crear funciones a las que llamará el programa principal.
Para validar la sintaxis de la función «teléfono móvil», le decimos que tiene que empezar por 6 o 7 y que tiene que tener 8 dígitos más.
movil() { if [ $(echo "$1" | grep "^[67][0-9]\{8\}$") ] then return 0 else return 1 fi }
Hacemos lo mismo con la función «teléfono fijo». En este caso empezará por 8 o 9.
fijo() { if [ $(echo "$1" | grep "^[98][0-9]\{8\}$") ] then return 0 else return 1 fi }
Para validar el DNI establecemos que tiene que tener una longitud de 7 u 8 caracteres numéricos e incluimos un código para separar la letra y validarla.
dni() { if [ $(echo "$1" | grep "^[0-9]\{7,8\}[A-Z]$") ] then return 0 else return 1 fi } laletra() { letra=$(echo $1 | cut -c9) numero=$(echo $1 | cut -c 1-8) resto=$(expr $numero % 23) contador=0 for i in T R W A G M Y F P D X B N J Z S Q V H L C K E T do if [ $contador -eq $resto ] then letrac=$i fi contador=$(expr $contador + 1) done if [ "$letra" = "$letrac" ] then return 0 else return 1 fi }
Y creamos la función para validar el correo-e. Lógicamente le tenemos que indicar que estará compuesto por una cadena alfanumérica, una @, otra cadena alfanumérica, un punto y dos o tres caracteres alfabéticos.
correoe() { if [ `echo "$1" | egrep -io "([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,3})"` ] then return 0 else return 1 fi }
En el programa principal haremos llamadas a estas funciones y no tendremos que incluir este código repetitivamente. Estas funciones las podemos utilizar para cualquier otro programa que realicemos.
Programa principal
Al comienzo del fichero tenemos que indicar el shell que utilizará y establecer el fichero que hemos creado como librería para que acceda a sus funciones.
#!/bin/sh . libreria.sh
A continuación que, si el fichero «agenda.csv» no existe, lo cree, introduciendo una cabecera indicando los campos. Y definimos la salida del programa.
if [ ! -f "agenda.csv" ] then echo "dni, nombre, domicilio, fijo, movil, correoe" > agenda.csv fi until [ "$salir" = "s" -o "$salir" = "S" ] do clear
Y vamos con el código para que nos solicite el DNI. Comprobará con la función de la librería si es correcto y si no es así nos lo volverá a solicitar.
eldni=0 until dni $eldni do echo "Introduzca el DNI: \c" read eldni if ! dni $eldni then echo "DNI Incorrecto" sleep 5 fi done
Para el nombre es más sencillo.
nombre="" while [ -z "$nombre" ] do echo "Introduzca el Nombre: \c" read nombre done
El domicilio es prácticamente igual.
domicilio="" while [ -z "$domicilio" ] do echo "Introduzca el Domicilio: \c" read domicilio done
Para los teléfonos fijo y movil es similar.
elfijo=0 until fijo $elfijo do echo "Introduzca un nºde tfno. Fijo: \c" read elfijo if ! fijo $elfijo then echo "num. Incorrecto" sleep 5 fi done elmovil=0 until movil $elmovil do echo "Introduzca un nºde tfno. Movil: \c" read elmovil if ! movil $elmovil then echo "num. Incorrecto" sleep 5 fi done
Para que nos solicite el correo-e
elcorreo=0 until correoe $elcorreo do echo "Introduzca una Direccion de correo e.: \c" read elcorreo if ! correoe $elcorreo then echo "correo Incorrecto" sleep 5 fi done
Ahora solo nos queda guardar los datos en el fichero «agenda.csv»
echo "$eldni, $nombre, $domicilio, $elfijo, $elmovil, $elcorreo" >> agenda.csv echo echo "$eldni, $nombre, $domicilio, $elfijo, $elmovil, $elcorreo" echo echo "registro guardado" echo sleep 5 echo echo "Si quiere continuar introduciendo contactos pulse <intro> 'S' o 's' para salir \c" read salir done exit 0
Dar permisos de ejecución
Para que funcione tenemos que dar permisos de ejecución al usuario en los dos ficheros.
chmod u+x agenda chmod u+x libreria.sh
Ejecución del programa
Para ejecutar el programa introducimos en la linea de comandos
./agenda o sh agenda

Vamos a ver como funciona introduciendo los datos mal la primera vez y luego bien.

Como vemos en la siguiente captura nos ha creado el fichero «agenda.csv» y ha añadido los datos que hemos introducido bien. Nos creara el fichero .csv en el directorio donde ejecutamos el programa.

Código del programa
Por si lo quieres probar, a continuación tienes todo el código. Solo tienes que copiar y pegar.
Fichero «libreria.sh»
# Esta libreria de funciones es para uso del programa "agenda" # Esta libreria ha sido creada por Francisco Javier Izquierdo Hidalgo. # Esta libreria es software libre, puedes redistribuirla y / o # modificarla bajo los términos de la Licencia Pública General de GNU # publicado por la Free Software Foundation, ya sea la versión 2 # de la Licencia, o (a su elección) cualquier versión posterior. # Esta libreria se distribuye con la esperanza de que sea útil, # pero SIN NINGUNA GARANTÍA, sin siquiera la garantía implícita de # COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO EN PARTICULAR. Ver el # GNU General Public License para más detalles. # movil() { if [ $(echo "$1" | grep "^[67][0-9]\{8\}$") ] then return 0 else return 1 fi } fijo() { if [ $(echo "$1" | grep "^[98][0-9]\{8\}$") ] then return 0 else return 1 fi } dni() { if [ $(echo "$1" | grep "^[0-9]\{7,8\}[A-Z]$") ] then return 0 else return 1 fi } laletra() { letra=$(echo $1 | cut -c9) numero=$(echo $1 | cut -c 1-8) resto=$(expr $numero % 23) contador=0 for i in T R W A G M Y F P D X B N J Z S Q V H L C K E T do if [ $contador -eq $resto ] then letrac=$i fi contador=$(expr $contador + 1) done if [ "$letra" = "$letrac" ] then return 0 else return 1 fi } correoe() { if [ `echo "$1" | egrep -io "([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,3})"` ] then return 0 else return 1 fi }
Fichero del programa «agenda»
#!/bin/sh # Este programa ha sido creado por Francisco Javier Izquierdo Hidalgo. # Este programa es software libre, puedes redistribuirlo y / o # modificarlo bajo los términos de la Licencia Pública General de GNU # publicado por la Free Software Foundation, ya sea la versión 2 # de la Licencia, o (a su elección) cualquier versión posterior. # Este programa se distribuye con la esperanza de que sea útil, # pero SIN NINGUNA GARANTÍA, sin siquiera la garantía implícita de # COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO EN PARTICULAR. Ver el # GNU General Public License para más detalles. . libreria.sh if [ ! -f "agenda.csv" ] then echo "dni, nombre, domicilio, fijo, movil, correoe" > agenda.csv fi until [ "$salir" = "s" -o "$salir" = "S" ] do clear # # Introducir el dni # eldni=0 until dni $eldni do echo "Introduzca el DNI: \c" read eldni if ! dni $eldni then echo "DNI Incorrecto" sleep 5 fi done # # Introducir el Nombre # nombre="" while [ -z "$nombre" ] do echo "Introduzca el Nombre: \c" read nombre done # # Introducir el Domicilio # domicilio="" while [ -z "$domicilio" ] do echo "Introduzca el Domicilio: \c" read domicilio done # # Introducir el Telefono fijo # elfijo=0 until fijo $elfijo do echo "Introduzca un nºde tfno. Fijo: \c" read elfijo if ! fijo $elfijo then echo "num. Incorrecto" sleep 5 fi done # # Introducir el Telefono movil # elmovil=0 until movil $elmovil do echo "Introduzca un nºde tfno. Movil: \c" read elmovil if ! movil $elmovil then echo "num. Incorrecto" sleep 5 fi done # # Introducir el correo electronico # elcorreo=0 until correoe $elcorreo do echo "Introduzca una Direccion de correo e.: \c" read elcorreo if ! correoe $elcorreo then echo "correo Incorrecto" sleep 5 fi done # # Guardamos los datos # echo "$eldni, $nombre, $domicilio, $elfijo, $elmovil, $elcorreo" >> agenda.csv echo echo "$eldni, $nombre, $domicilio, $elfijo, $elmovil, $elcorreo" echo echo "registro guardado" echo sleep 5 echo echo "Si quiere continuar introduciendo contactos pulse <intro> 'S' o 's' para salir \c" read salir done exit 0
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.
Gracias Javier
De nada Barto. Gracias por tu visita
Gracias Javier por la explicación detallada.
Tengo dos preguntas:
– ¿Que extensiones podemos encontrarnos para una librería?.
– ¿Puede ser encriptada la librería para que se mantenga la estructura del creador?
Gracias
La extensión será .sh en shellscript.
Puedes encriptar la librería pero tendrás que introducir código para desencriptarla cuando llames a ella. Lo lógico, creo, sería encriptar el fichero que guarda los datos.
A los ficheros de la agenda y la librería les puedes modificar los permisos para que solo tengan permiso de ejecución por parte del propietario. Estoy preparando un artículo sobre los permisos.
Gracias por tu visita y preguntas.