Bucles de matriz en Bash

En este artículo, le mostraremos los diversos métodos para recorrer arreglos en Bash. Los bucles de matriz son tan comunes en la programación que casi siempre necesitarás...

En este artículo, le mostraremos los diversos métodos para recorrer arreglos en Bash. Los bucles de matriz son tan comunes en la programación que casi siempre necesitará usarlos en cualquier programación importante que realice. Para ayudar con esto, debe aprender y comprender los diversos tipos de arreglos y cómo recorrerlos, que es exactamente lo que presentamos en este artículo.

Antes de continuar con el propósito principal de este tutorial/artículo, aprendamos un poco más sobre la programación con Bash shell y luego mostraremos algunas construcciones comunes de programación de Bash.

Una breve introducción a Bash Shell

Shell es un término de Unix para la interfaz de usuario interactiva con sistemas operativos. El shell es la capa de programación que comprende y ejecuta los comandos que ingresa un usuario. En algunos sistemas, el shell se denomina intérprete de comandos. Básicamente, cualquier cosa que pueda hacer con las herramientas GUI OS en Linux, generalmente puede hacer lo mismo con un shell.

La mayoría de los sistemas operativos similares a Unix vienen con un shell como Intento shell, Bourne shell, C shell (csh) y KornShell. Sin embargo, estos shells no siempre vienen preinstalados con las distribuciones populares de Linux, como Ubuntu, Cent OS, Kali, Fedora, etc. Aunque el popular shell Bash se incluye con la mayoría de las distribuciones de Linux y OSX.

El shell Bash es una versión mejorada del antiguo shell Bourne, que fue uno de los primeros shell de Unix/Linux de uso general por parte de la base de usuarios. Tenía características limitadas en comparación con los shells de hoy en día, y debido a esto, la mayor parte del trabajo de programación fue realizado casi en su totalidad por utilidades externas.

Bash, que es un shell compatible con POSIX, simplemente significa Bourne-again shell. Originalmente se creó como reemplazo del shell Bourne y, por lo tanto, vino con muchas mejoras que no estaban disponibles en los shells anteriores.

Para encontrar el tipo o la versión de Bash que tiene instalado su sistema operativo, simplemente escriba el siguiente comando:

1
2
$ echo $BASH_VERSION
3.2.57(1)-release

Scripting de Shell con Bash

Un script de shell es un archivo que contiene uno o más comandos que escribiría en la línea de comandos. En un script, estos comandos se ejecutan en serie automáticamente, como un programa C o Python. Estos son algunos ejemplos de comandos comunes:

  • cat: muestra el contenido de un archivo o combina dos archivos. El nombre original del comando 'gato' es 'concatenar'
  • ls: lista de archivos/carpetas en un directorio
  • pwd: muestra la ruta de su directorio de trabajo actual
  • chmod: Modificar o cambiar los permisos de un archivo
  • chown: Cambiar la propiedad de un archivo o un programa de script
  • mkdir: Crear un directorio
  • mv: Mover un archivo o carpeta de un directorio a otro
  • rm: Eliminar (eliminar) un archivo o directorio
  • cd: cambia tu directorio de trabajo actual
  • exit: Cerrar o salir de una terminal

Hay muchos más comandos básicos que no se mencionan aquí, sobre los que puede encontrar información fácilmente dada la gran cantidad de documentación en Internet. Sin embargo, aprender los comandos básicos anteriores le enseñará mucho de lo que necesita saber.

Puede notar a lo largo de este artículo que cada primera línea de un script de shell comienza con el asunto o hash-bang. Es un tipo especial de comentario que le dice al shell qué programa usar para ejecutar el archivo. Para scripts de shell, esta es la línea #!/bin/bash.

Ahora que ha estado expuesto a algunos comandos comunes de Bash, es hora de comprender cómo usar matrices y bucles. Y finalmente, mostraremos algunos ejemplos del mundo real de cómo puede recorrer matrices en scripts de Bash.

Bucles en Bash

"Loops", o "looping", es simplemente una construcción en la que ejecuta un evento particular o una secuencia de comandos hasta que se cumple una condición específica, que generalmente establece el programador. Tenemos tres tipos de bucles disponibles en la programación de Bash:

  • tiempo
  • por
  • Hasta que
Mientras Bucle

Si alguna vez ha programado antes en cualquier idioma, probablemente ya conozca los bucles y cómo puede usarlos para controlar el flujo de un programa o script además de if, elif y else. El bucle le permite iterar sobre una lista o un grupo de valores hasta que se cumpla una condición específica.

A continuación se muestra la sintaxis del bucle while:

1
2
3
4
while <list>
do
    <commands>
done

La condición dentro del bucle while puede depender de variables previamente declaradas, según sus necesidades. Supongamos que hemos escrito un programa llamado count.sh. El programa de contador imprime los números del 0 al 10. Por lo tanto, nuestro programa de contador “recorrerá” del 0 al 10 solamente.

1
2
3
4
5
6
7
8
#!/bin/bash

count=0
while [ $count -le 10 ]
do
    echo "$count"
    count=$(( $count + 1 ))
done

La condición aquí es $count -le 10, que devolverá un valor true siempre que la variable $count sea menor o igual (-le) a 10. Cada vez que esta condición devuelve true , se ejecutan los comandos entre do y done.

Hasta bucle

Además de while, también podemos usar el bucle hasta que es muy similar al bucle while. La sintaxis del bucle hasta es la misma que la del bucle while, sin embargo, la principal diferencia es que la condición es opuesta a la de while. Aquí los comandos del bucle se ejecutan cada vez que la condición falla, o devuelve falso.

1
2
3
4
5
6
7
8
#!/bin/bash

count=0
until [ $count -gt 10 ]
do
    echo "$count"
    count=$(( $count + 1 ))
done

Aquí el bucle se ejecuta cada vez que $count no es mayor que (-gt) 10.

Bucle for

Sintácticamente, el bucle for es un poco diferente de los bucles while o until. Estos tipos de bucles manejan el incremento del contador por nosotros, mientras que antes teníamos que incrementarlo por nuestra cuenta.

La sintaxis del bucle for en Bash es:

1
2
3
4
5
6
#!/bin/bash

for (( n=1; n<=10; n++ ))
do
    echo "$n"
done

Dentro de la condición de bucle, le decimos en qué número iniciar el contador (n=1), en qué número finalizar el contador (n<=10) y cuánto incrementar el contador en (n++ ).

Otra forma de usar este ciclo es así:

1
2
3
4
5
6
#!/bin/bash

for user in Kate Jake Patt
do
    echo "$user"
done

Aquí ejecutamos el bucle para cada instancia de cadena, que en este caso es "Kate", "Jake" y "Patt".

Matrices en Bash

En Bash, hay dos tipos de arreglos. Están los arreglos asociativos y los arreglos indexados por enteros. Los elementos de los arreglos se denominan con frecuencia por su número de índice, que es la posición en la que residen en el arreglo. Estos números de índice son siempre números enteros que comienzan en 0.

Los arreglos asociativos son un poco más nuevos, ya que llegaron con la versión de Bash 4.0.

A continuación se muestra la sintaxis para declarar y usar una matriz indexada por enteros:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

array=( A B C D E F G )
echo "${array[0]}"
echo "${array[1]}"
echo "${array[2]}"
echo "${array[3]}"
echo "${array[4]}"
echo "${array[5]}"
echo "${array[6]}"

En este artículo, nos centraremos en la matriz indexada por enteros para nuestro tutorial de bucles de matriz, por lo que omitiremos la cobertura de matrices asociativas en Bash por ahora, pero solo sepa que es bueno estar al tanto de su existencia.

Bucle sobre arreglos

Ahora que hemos visto y entendido los comandos básicos del shell de Bash, así como los conceptos básicos de bucles y matrices en Bash, avancemos y veamos un script útil que utiliza bucles y matrices juntos.

En nuestro sencillo ejemplo a continuación, supondremos que desea mostrar una lista de los usuarios registrados de su sitio web en la pantalla. La lista de usuarios se almacena en la variable usuarios, que debe recorrer para mostrarlos.

1
2
3
4
5
6
7
#!/bin/bash

users=(John Harry Jake Scott Philis)
for u in "${users[@]}"
do
    echo "$u is a registered user"
done

Con esta sintaxis, recorrerá la matriz users, y cada nombre se almacenará temporalmente en u. La sintaxis [@] le dice al intérprete que esta es una matriz indexada sobre la que estaremos iterando.

Hay bastantes formas en que podemos usar los bucles de matriz en la programación, así que asegúrese de no limitarse a lo que ve aquí. Simplemente mostramos los ejemplos más básicos, que puede mejorar y modificar para manejar su caso de uso.