Script Shell Bash para implementar un menú de usuario

En el post de hoy vamos a revisar el contenido de un script que interactúa con el usuario a través de un menú de opciones. No se trata de una utilidad empleada a menudo en los scripts de Shell Bash, pero nunca nos vendrá de más saber que disponemos de la posibilidad de crear un menú. Como siempre os digo, no pretendo elaborar una aplicación compleja y aquí la idea simplemente es crear un menú básico con algunas opciones. A partir de este ejemplo, vuestra creatividad ya puede ir incrementando su alcance hasta límites insospechados.

 

 

Script Shell Bash para implementar un menú de usuario


En primer lugar, voy a mostraros el código completo del ejemplo que nos permitirá trabajar con un menú de usuario. Posteriormente, ya os iré explicando en detalle qué es lo que se quiere realizar en cada uno de los subprocesos del script.

En este código se están empleando varias funciones:

  • solicitar_usuario()
  • validar_usuario()
  • crear_usuario()
  • eliminar_usuario()


# --------------------------------------------------

#!/bin/bash

 

# Funcion que solicita introducir usuario y contraseña

# --------------------------------------------------

solicitar_usuario() {

 

  # Recogemos el parametro $1 enviado a la funcion

  # Si no se recibe nada, asignamos valor por defecto

  message=${1:-"Introduzca los datos de la cuenta"}

  echo "$message"

 

  # Solicitamos y recogemos el usuario introducido

  read -p "Introduzca usuario: " usuario

 

  # Solicitamos y recogemos password

  # -s --> El contenido introducido por el usuario no se muestra por pantalla

  read -sp "Introduzca contraseña: " password

  echo ""

 

  # Solicitamos al usuario que verifique la password

  read -sp "Repita contraseña: "  password_validar

  echo ""

}

 

# Funcion que valida la existencia de una cuenta de usuario

# Retorno 0 --> usuario ya existente

# Retorno 1 --> usuario valido

# -------------------------------------------------- 

validar_usuario() {

 

  validacion=1

 

  # Verificamos si ya existe la cuenta recibida por la funcion

  # Para ello, validamos si existe la cuenta en el fichero "cuentas" del directorio "accesos"

  cuenta=$(grep ${1} accesos/cuentas)

 

  # Si encuentra la cuenta, devuelve un retorno cero

  if [ "$cuenta" == ${1} ] ; then

    validacion=0

  fi

 

  echo "validacion: $validacion"

  return $validacion

}

 

# Funcion para añadir el usuario a la plataforma

# -------------------------------------------------- 

crear_usuario() {

 

  solicitar_usuario "Introduzca los datos del nuevo usuario"

 

  # Validamos si el usuario introducido ya existe en el registro de cuentas

  while validar_usuario "$usuario" ; do

    solicitar_usuario "El usuario elegido ya existe, por favor seleccione otro usuario"

  done

 

  # Validamos que la password ha sido correctamente introducida

  while [ "$password" != "$password_validar" ] ; do

    solicitar_usuario "Las passwords no coinciden, reintroduzca los datos"

  done

 

  # Insertamos el usuario en la lista de cuentas de la plataforma

  echo "$usuario" >> accesos/cuentas

  echo "$usuario creado"

 

}

 

# Funcion para eliminar el usuario de la plataforma

# -------------------------------------------------- 

eliminar_usuario() {

 

  read -p "Introduzca el usuario a eliminar: " usuario

 

  # Comprobamos que el usuario a eliminar realmente existe en el registro de cuentas

  # Si no existe, abandonamos la funcion sin ejecutar ninguna eliminacion

  while ! validar_usuario "$usuario" ; do

    echo "Usuario no encontrado"

    return 1

  done

 

  # Eliminar usuario

  grep -Ev "$usuario" accesos/cuentas > accesos/cuentas_tmp

  mv accesos/cuentas_tmp accesos/cuentas

 

  echo "$usuario eliminado"

 

}

 

 

# Generamos el menu de la aplicacion

# -------------------------------------------------- 

while true ; do

 

  clear

 

  # Mostrar opciones de menu

  echo "Gestion de usuarios"

  echo "1: Crear usuario"

  echo "2: Eliminar usuario"

  echo "3: Listar usuarios"

  echo "4: Salir"

 

  read -sn1 opcion

 

  echo ""

 

  # Tratar la opcion seleccionada del menu

  case "$opcion" in

    1) crear_usuario;;

    2) eliminar_usuario;;

    3) cat accesos/cuentas

       read -n1 -p "" ;;

    4) exit 0;;

  esac

 

  read -n1 -p "Presione cualquier tecla"

 

done

# --------------------------------------------------

 

Detalle del Script para implementar un menú

 

A continuación, vamos a revisar con un poco de detalle qué es lo que se quiere realizar en cada uno de los apartados del script.


1º) Función solicitar_usuario(): En esta función lo que hacemos es solicitar al usuario que introduzca un nombre de usuario y su password asociada. En primer lugar, se comprueba si esos datos se reciben como parámetros de entrada de la ejecución del script y, en caso negativo, se lanzan comandos "read" para que el usuario provisione ambos valores.

 

# Funcion que solicita introducir usuario y contraseña

# --------------------------------------------------

solicitar_usuario() {

 

  # Recogemos el parametro $1 enviado a la funcion

  # Si no se recibe nada, asignamos valor por defecto

  message=${1:-"Introduzca los datos de la cuenta"}

  echo "$message"

 

  # Solicitamos y recogemos el usuario introducido

  read -p "Introduzca usuario: " usuario

 

  # Solicitamos y recogemos password

  # -s --> El contenido introducido por el usuario no se muestra por pantalla

  read -sp "Introduzca contraseña: " password

  echo ""

 

  # Solicitamos al usuario que verifique la password

  read -sp "Repita contraseña: "  password_validar

  echo ""

}

 

2º) Función validar_usuario(): En esta función lo que se hace es validar si un usuario determinado se encuentra ya dado de alta en la plataforma. Para ello, en primer lugar recogemos el usuario concreto enviado a la función en el parámetro ${1}. A continuación, procedemos a comprobar si dicho usuario se encuentra dado de alta en el fichero "cuentas" (fichero en el que están almacenados todos los usuarios que tienen acceso a la plataforma). En función de si lo encontramos o no, se devolverá una respuesta u otra.

 

# Funcion que valida la existencia de una cuenta de usuario

# Retorno 0 --> usuario ya existente

# Retorno 1 --> usuario valido

# -------------------------------------------------- 

validar_usuario() {

 

  validacion=1

 

  # Verificamos si ya existe la cuenta recibida por la funcion

  # Para ello, validamos si existe la cuenta en el fichero "cuentas" del directorio "accesos"

  cuenta=$(grep ${1} accesos/cuentas)

 

  # Si encuentra la cuenta, devuelve un retorno cero

  if [ "$cuenta" == ${1} ] ; then

    validacion=0

  fi

 

  echo "validacion: $validacion"

  return $validacion

}

 

3º) Función crear_usuario(): En esta función se procede a dar de alta un usuario en la plataforma. Para ello, se inserta el usuario en el fichero "cuentas".

 

# Funcion para añadir el usuario a la plataforma

# -------------------------------------------------- 

crear_usuario() {

 

  solicitar_usuario "Introduzca los datos del nuevo usuario"

 

  # Validamos si el usuario introducido ya existe en el registro de cuentas

  while validar_usuario "$usuario" ; do

    solicitar_usuario "El usuario elegido ya existe, por favor seleccione otro usuario"

  done

 

  # Validamos que la password ha sido correctamente introducida

  while [ "$password" != "$password_validar" ] ; do

    solicitar_usuario "Las passwords no coinciden, reintroduzca los datos"

  done

 

  # Insertamos el usuario en la lista de cuentas de la plataforma

  echo "$usuario" >> accesos/cuentas

  echo "$usuario creado"

 

}

 

Como se aprecia, antes de crear el usuario, en la función se realizan tres acciones previas:

* Se solicita que se introduzca el nombre del usuario mediante una invocación a la función solicitar_usuario (función que hemos visto más arriba). 

* Se establece un bucle que se repite mientras el usuario no supere la validación. Para validar se invoca a la función validar_usuario (función que hemos visto más arriba). Si no se supera la validación, se vuelve a solicitar de nuevo el usuario invocando a la función solicitar_usuario.

* Se establece un bucle que se repite mientras la password no supere la validación. Si no se supera la validación de doble confirmación, se vuelve a solicitar de nuevo el usuario invocando a la función solicitar_usuario.

 

4º) Función eliminar_usuario(): En esta función se procede a eliminar el usuario indicado. En primer lugar, se valida que el usuario no exista en la plataforma, cosa que se realiza invocando a la función validar_usuario. Si no existe, abandonamos la función sin realizar ninguna acción. Y si existe el usuario, procedemos a darlo de baja del fichero "cuentas".

 

# Funcion para eliminar el usuario de la plataforma

# -------------------------------------------------- 

eliminar_usuario() {

 

  read -p "Introduzca el usuario a eliminar: " usuario

 

  # Comprobamos que el usuario a eliminar realmente existe en el registro de cuentas

  # Si no existe, abandonamos la funcion sin ejecutar ninguna eliminacion

  while ! validar_usuario "$usuario" ; do

    echo "Usuario no encontrado"

    return 1

  done

 

  # Eliminar usuario

  grep -Ev "$usuario" accesos/cuentas > accesos/cuentas_tmp

  mv accesos/cuentas_tmp accesos/cuentas

 

  echo "$usuario eliminado"

 

}

 

5º) Menú de la aplicación: A continuación, abrimos un bucle para mostrar el menú de aplicación y tratar la opción seleccionada por el usuario. En el menú mostramos las opciones disponibles y finalmente recogemos la opción seleccionada mediante un comando "read".


# Generamos el menu de la aplicacion

# -------------------------------------------------- 

while true ; do

 

  clear

 

  # Mostrar opciones de menu

  echo "Gestion de usuarios"

  echo "1: Crear usuario"

  echo "2: Eliminar usuario"

  echo "3: Listar usuarios"

  echo "4: Salir"

 

  read -sn1 opcion

 

  echo ""

 

6º) Tratar la opción seleccionada del menú: En este último apartado, lo que se hace es lanzar el tratamiento correspondiente en función de la opción seleccionada por el usuario.


  # Tratar la opcion seleccionada del menu

  case "$opcion" in

    1) crear_usuario;;

    2) eliminar_usuario;;

    3) cat accesos/cuentas

       read -n1 -p "" ;;

    4) exit 0;;

  esac

 

  read -n1 -p "Presione cualquier tecla"


Los tratamientos son los siguientes:

* Crear usuario invocando a la función crear_usuario.

* Eliminar usuario invocando a la función eliminar_usuario.

* Listar usuarios mostrando todos los usuarios contenidos en el fichero "cuentas".

* Salir del menú y del script mediante un "exit 0".


Funcionamiento del menú del Script


A continuación vamos a echar un vistazo a las ventanas que nos tendrían que salir si vamos ejecutando cada una de las opciones del menú. Partimos de la base de que en el fichero "cuentas" tenemos estos usuarios dados de alta en la plataforma.


En primer lugar, si ejecutamos el script nos debería salir un menú similar al siguiente:

 


👉 Crear usuario: Si seleccionamos la opción "1: Crear usuario", el script nos pedirá que introduzcamos el nuevo usuario y su password. Una vez introducido, el usuario será insertado en la plataforma.



Si consultamos el fichero "cuentas", deberíamos observar que ya se ha incluido el nuevo usuario dado de alta.

 

 

👉 Listar usuarios: Si seleccionamos la opción "3: Listar usuarios", el script nos debería mostrar los usuarios que actualmente están dados de alta en la aplicación.

 

 

 

👉 Eliminar usuario: Si seleccionamos la opción "2: Eliminar usuario", el script nos pedirá el nombre del usuario que debe ser eliminado de la plataforma.

 

 

 

Si posteriormente consultamos la lista de usuarios, ya no nos debería salir el usuario que acabamos de eliminar.

 

 

👉 Salir del menú: Finalmente, si seleccionamos la opción "4: Salir", el script detendrá su ejecución y nos devolverá a la línea de comandos.

 


En principio, con esto nos podríamos hacer una idea de cómo deben funcionar las opciones de este menú. Obviamente, nos faltaría verificar el funcionamiento de todas las validaciones, pero en líneas generales nos sirve para quedarnos con la visión global. A partir de aquí, vosotros mismos ya podéis añadirle las opciones que creais convenientes.


Pues nada, eso es todo lo que quería comentaros en relación con la implementación de un menú de usuario desde el Shell Bash. Como veis, no se trata de crear una aplicación complicada, sino de entender cómo se monta el esqueleto de un script con menú de usuario. A partir de este código, vosotros podéis escalarlo y añadirle toda la complejidad que queráis. No os debería resultar demasiado díficil. 

¡Hasta el próximo post!


Saludos.


Comentarios

Entradas populares de este blog

Componentes y Ventanas de Java Swing

Creación de Webservice SOAP básico

Fichero standalone del Servidor JBoss EAP