En este momento estás viendo Uso de librerías en programación shell scripting

Uso de librerías en programación shell scripting

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, al pie del post tienes un formulario para hacerlo.

Y si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, o te quieres suscribir para recibir un correo-e una vez al mes con las nuevas publicaciones, en la página de contacto , tienes otro formulario.

Esta entrada tiene 4 comentarios

  1. Josévi

    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

    1. 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.

Deja una respuesta

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