A menudo es necesario realizar una misma acción sobre todos los elementos de un conjunto, como por ejemplo sobre todas las líneas de un archivo de texto o una lista de archivos. Si bien podríamos llegar a implementar este objetivo utilizando una serie de condicionales, los bucles en shell scripts nos permitirán cumplir con el mismo más fácilmente.
Bucles en shell scripts: for
Este tipo de bucle se utiliza para realizar una determinada acción un número definido de veces que se conoce de antemano. La sintaxis es la siguiente:
[pastacode lang=»bash» manual=»for%20VARIABLE%20in%20elemento1%20elemento2…%20elementoN%3B%20do%0A%20%20%20%20acci%C3%B3n%0Adone» message=»» highlight=»» provider=»manual»/]
Por ejemplo, supongamos que quisiéramos renombrar una lista de archivos colocándoles .bkp al final:
[pastacode lang=»bash» manual=»for%20ARCHIVO%20in%20archivo1.conf%20archivo2.conf%20archivo3.conf%3B%20do%0A%20%20%20%20mv%20%24ARCHIVO%20%24ARCHIVO.bkp%0Adone» message=»» highlight=»» provider=»manual»/]
En este ejemplo, nombramos (de manera arbitraria) nuestra variable como ARCHIVO. La acción que deseamos realizar se llevará a cabo sobre cada archivo de la lista. Durante la primera iteración, $ARCHIVO=archivo1.conf será renombrado a archivo1.conf.bkp. Lo mismo sucederá con archivo2.conf y archivo3.conf en la segunda y tercera iteraciones, respectivamente.
El bucle while
Si no conocemos inicialmente el número de elementos del conjunto, utilizaremos el bucle while, el que nos permite ejecutar una acción mientras (del inglés while) se cumpla una cierta condición. La sintaxis de este bucle se muestra a continuación:
[pastacode lang=»bash» manual=»while%20CONDICI%C3%93N%3B%20do%20%0A%20%20%20%20ACCI%C3%93N%0Adone» message=»» highlight=»» provider=»manual»/]
Mientras se cumpla CONDICIÓN, se llevará a cabo ACCIÓN (que puede consistir en una serie de comandos o en uno individual). La gran mayoría de los ejemplos que se pueden encontrar en Internet sobre el tema ejemplifican este bucle con ejemplos triviales y poco útiles, como mostrar un saludo, hacer una cuenta regresiva, etc. Poco útil en la práctica de un administrador de sistemas.
Con la ayuda del siguiente while loop, podemos tomar el archivo /etc/passwd como entrada e identificar aquellas cuentas de usuario que posean a Bash como shell por defecto. Debemos asegurarnos de que solamente usuarios físicos (y no aquellas cuentas que se utilicen para correr servicios) cuenten con acceso a Bash.
En la Fig. 1 podemos ver la lista de cuentas de usuario con acceso a Bash. Nos proponemos escribir un script que nos permita examinar una por una y guardar un mensaje en el archivo tareas.txt si el usuario en cuestión no debe acceder a Bash. Podríamos hacerlo en el mismo paso, pero para evitar equivocaciones que resulten en cuentas bloqueadas es mejor dejar esa tarea para luego.
Con la ayuda de la sentencia case, que veremos en el próximo post (último en nuestra serie introductoria de shell scripting), podremos lograr nuestro objetivo. ¡Nos leemos en breve!