Case en shell scripts: cuando hay más de un camino

En el post anterior explicamos el uso de los bucles for y while. En esta oportunidad, y para completar el ejemplo que dejamos pendiente, vamos a tratar el uso de la sentencia case en shell scripts. De esta manera, podremos elegir una posibilidad entre varias y ejecutar distintos comandos según la que escojamos sin tener que recurrir a una cadena de condicionales.

La sentencia case en shell scripts

Un caso clásico del control de flujo de un programa o script se da en el caso cuando existen dos o más alternativas viables, y debemos elegir una basada en una condición. Por ejemplo, cuando se nos presenta un menú numerado por pantalla. En tal caso, el flujo del programa a partir de ese punto quedará dado por nuestra elección de las opciones disponibles.

Basándonos en el ejemplo del post anterior, digamos que queremos examinar una a una las cuentas de usuario con acceso a Bash y elegir si deseamos agregar un recordatorio para quitarlo. Antes de comenzar, crearemos el archivo vacío tareas.txt en el directorio actual:

[pastacode lang=»bash» manual=»touch%20tareas.txt» message=»» highlight=»» provider=»manual»/]

A continuación, guardaremos las siguientes líneas en el script ejemplocase.sh:

[pastacode lang=»bash» manual=»%23!%2Fbin%2Fbash%0A%0A%23%20En%20este%20archivo%20guardaremos%20la%20lista%20de%20tareas%0AARCHIVO_TAREAS%3Dtareas.txt%0A%0A%23%20En%20este%20otro%20tendremos%20la%20lista%20de%20usuarios%20con%20acceso%20a%20Bash%0AUSUARIOS_BASH%3DusuariosBash.txt%0A%0A%23%20Si%20el%20archivo%20de%20tareas%20existe%2C%20borrarlo%20primero%0Aif%20%5B%20-f%20%24ARCHIVO_TAREAS%20%5D%3B%20then%0A%20%20%20%20rm%20%24ARCHIVO_TAREAS%0Afi%0A%0A%23%20Guardar%20la%20lista%20de%20usuarios%20con%20acceso%20a%20Bash%20en%20usuariosBash.txt%0Agrep%20bash%20%2Fetc%2Fpasswd%20%7C%20cut%20-d%3A%20-f1%20%3E%20%24USUARIOS_BASH%0A%0A%23%20Examinar%20cuenta%20por%20cuenta%0Awhile%20read%20CUENTA%0Ado%0A%20%20%20%20%23%20Mostrar%20un%20mensaje%20por%20cada%20usuario.%20Leer%20la%20respuesta%20desde%20la%20terminal%0A%20%20%20%20read%20-p%20%22Quitar%20acceso%20a%20Bash%20a%20%24CUENTA%3F%20%5Bs%2Fn%5D%3A%20%22%20QUITAR%20%3C%20%2Fdev%2Ftty%0A%20%20%20%20%20%20%20%20case%20%24QUITAR%20in%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BsS%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Si%20la%20respuesta%20es%20S%C3%AD%20%5BsS%5D%2C%20agregar%20mensaje%20al%20archivo%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22Quitar%20acceso%20a%20Bash%20a%20%24CUENTA%22%20%3E%3E%20%24ARCHIVO_TAREAS%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%5BnN%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20De%20otra%20manera%2C%20mostrar%20mensaje%20por%20pantalla%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22Eligi%C3%B3%20no%20quitar%20el%20acceso%20a%20Bash%20a%20%24CUENTA.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3B%3B%0A%20%20%20%20%20%20%20%20esac%0A%23%20Usar%20el%20archivo%20usuariosBash.txt%20como%20entrada%20del%20bucle%0Adone%20%3C%20%24USUARIOS_BASH» message=»» highlight=»» provider=»manual»/]

y le daremos permisos de ejecución:

[pastacode lang=»bash» manual=»chmod%20%2Bx%20ejemplocase.sh» message=»» highlight=»» provider=»manual»/]

Antes de ejecutarlo, aclaremos algunas cosas primero:

  • La lista de usuarios con acceso a Bash se toma del primer campo del archivo /etc/passwd y se guarda en usuariosBash.txt utilizando grep y cut (dos comandos que hemos tratado en posts anteriores)
  • El bucle while lee línea por línea del archivo usuariosBash.txt y guarda el contenido de la misma (que es diferente en cada iteración) en la variable CUENTA. En este caso, read CUENTA es la condición a evaluar. Mientras se lee el archivo (desde la primera hasta la última línea), esta condición se cumple.
  • Con el comando read -p podemos mostrar un mensaje por pantalla y guardar la respuesta del usuario en la variable que colocamos luego del mensaje. En este caso dicha variable es QUITAR.
  • Al colocar < /dev/tty, estamos indicando que debemos esperar por una respuesta del usuario mediante la terminal que controla el proceso actual (el script en ejecución).
  • A continuación, con la palabra clave case evaluamos la entrada del usuario. Si dicha entrada consiste en una letra s o S, se guarda un mensaje en el archivo tareas.txt. De otra manera (n o N), se muestra un mensaje por pantalla.
  • Cada opción evaluada por case debe finalizar en dos punto y coma (;;), y el bloque debe cerrarse con la palabra clave esac.

Veamos el resultado en la Fig. 1:

Ejemplo de case en shell scripts
Figura 1 – Ejemplo de case en shell scripts

En el caso de alumno y miservicio, elegimos la opción s y por lo tanto, se guardó el mensaje correspondiente en tareas.txt. Para los otros usuarios se mostró un mensaje por pantalla.

Quizás este ejemplo pueda parecer un poco rudimentario para un administrador de sistemas experimentado. Sin embargo, es sumamente útil para ilustrar los conceptos de bucles y de la sentencia case en shell scripts.

Espero que les haya servido. ¡Hasta el próximo post!