Este es uno de los capítulos del tutorial Scripts en Bash. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Después de que viste en el capítulo anterior como podías repetir una y otra vez una serie de acciones utilizando bucles en Bash, ha llegado el momento de darle una oportunidad a las listas, arrays, vectores, matrices, etc. Desde luego que si eres nuevo en esto de la programación, lo de arrays te puede sonar un poco raro, pero, la palabra lista, la tienes a la orden del día. Sin ir mas lejos, la lista de la compra. Así en este capítulo del tutorial verás como tratar con arrays en Bash.
Y aunque, a lo largo de este capítulo hable de arrays, tu lo puedes leer como listas. Mas si cabe, teniendo en cuenta que, Bash no soporta los arrays multimimensionales, con lo que siempre estoy hablando de listas, vectores o arrays de una dimensión. Y aun en el caso de que fueran arrays multidimensionales, siempre los podrías tratar como listas de listas.
Sea como fuere, la idea es que te sientas cómodo con el concepto, y la idea de una lista siempre parece que resulta mucho mas comprensible.
Arrays en Bash
Declarando un Array
En Bash existen diferentes formas de declarar un array,
- asignando valores, por ejemplo
distros[0]='Ubuntu'
- utilizando la palabra clave
declare
, como por ejemplodeclare -a distros=('Ubuntu' 'Linux Mint')
- o directamente con
distros=('Ubuntu' 'Linux Mint')
Indicarte cada uno de los elementos del array lo he puesto entre comillas, porque el segundo, tiene espacios. Lo cierto es que podría no haber utilizado comillas en Ubuntu
. Es mas, también podía haberme ahorrado las comillas en Linux Mint
si hubiera escapado el espacio, como por ejemplo en,
distros=(Ubuntu Linux\ Mint)
Por otro lado, en los ejemplos anteriores solo he puesto texto. Sin embargo, lo cierto, es que en Bash, los arrays pueden contener diferente tipos de elementos. Es decir, podemos tener texto y números como por ejemplo en,
distros=(Ubuntu 1234 Linux\ Mint)
Accediendo al contenido de los arrays en Bash
Una vez ya tienes declarado tu array, el siguiente paso, es acceder a su contenido. Primero de forma individual. Así, vamos a partir del array de distribuciones que has declarado anteriormente,
distros=(Ubuntu Linux\ Mint Deepin Manjaro Elementary)
Para acceder de forma individual a cada una de las distros, tienes que utilizar la siguiente sintaxis, ${distros[i]}
. Así por ejemplo para imprimir la primera de las distros, utilizarías echo ${distros[0]}
.
Ahora, si lo que haces es echo $distros
obtendrás el primer elemento del array.
Si en lugar de imprimir una sola distribución en concreto, quisieras imprimirlas todas en la misma línea, ejecuta echo ${distros[@]}
. ¿Y si quisieras imprimir una por línea?. Aquí es donde intervienen los bucles que viste en el capítulo anterior del tutorial. Por ejemplo,
for i in "${distros[@]}"
do
echo $i
done
Observa que he puesto el array entrecomillado, es decir, "${distros[@]}"
. Si no lo haces así, imprimirá Linux
en una línea y Mint
en otra línea.
Pero no solo puedes acceder de uno en uno al contenido de los elementos de tu array. También puedes extraer varios de golpe. Por ejemplo,
echo ${distros[@]:1:2}
Extraerá dos elementos empezando por la posición 1
, es decir por Linux Mint
. Así en tu caso, el resultado sería Linux Mint Deepin
.
Esto también lo puedes hacer con el texto. Así, te recomiendo que le des un vistazo al artículo sobre manipular texto. Donde podrás ver, que la sintaxis utilizada para los arrays, es exactamente la misma que para las cadenas de texto. Así, en el ejemplo, si ejecutas echo ${distros[0]:2:4}
te devolverá untu
.
En este sentido, ya te puedes imaginar, que puedes hacer las mismas operaciones que hacía en el artículo que te he indicado anteriormente. Así, para reemplazar un elemento de tu array en Bash, solo tienes que ejecutar la siguiente instrucción,
echo ${distros[@]/Linux\ Mint/Debian}
Cuantos elementos tiene tu array
Para saber cuantos elementos tienen un array en Bash, tienes que utilizar #
. Así, en el ejemplo que estás utilizando de las distros, si quieres conocer cuantas distribuciones tienes utiliza `echo ${#distros[@]}.
Si quieres saber la longitud de uno de los elementos del array, entonces deberás referirte a él. Por ejemplo, si ejecutas echo ${#distros[0]}
te devolverá 6
, el número de letras de la palabra Ubuntu
.
Operaciones con arrays en Bash
Una vez ya sabes como puedes crear tu array en Bash, conoces los elementos que tienes, y sabes como puedes ver el contenido, ha llegado el momento de modificar el array. Me refiero, a añadir y quitar elementos de tu array, y también, por supuesto a concatenar arrays.
Puedes añadir un elemento a tu array, ya sea por delante,
distros=(Arch "${distros[@]}")
como también puedes añadirlo por detrás, como por ejemplo
distros=("${distros[@]}" Arch)
Incluso podrías intercalarlo,
distros=("${distros[@]:0:2}" Arch "${distros[@]:3}")
Ahora, para quitar un elemento del array, tienes que utilizar unset
. Por ejemplo, para quitar el segundo elemento, ejecutarías unset distros[1]
. Aunque esto tiene un ligero inconveniente, y es que si ahora haces un echo "${distros[1]}"
no te devolverá nada.
Tampoco es muy preocupante, porque si iteras sobre los elementos del array, no te lo devolverá. Por ejemplo,
for i in "${distros[@]}"
do
echo "$i"
done
De cualquier forma, puedes quitar el elemento, utilizando
distros=(${distros[@]:0:1} ${distros[@]:2})
También puedes quitar elementos del array utilizando patrones, como por ejemplo,
distros=(${distros[@]/Ubuntu/})
Concatenando, dividiendo y borrando arrays en Bash
Con lo que has visto hasta el momento, ya controlas perfectamente desde crear un array en Bash, acceder a los elementos del array, y modificar su contenido. Ahora ya solo queda ver como unir dos o mas arrays, dividir un array en varios y por supuesto borrar un array. Aunque realmente no es exactamente así, puesto que si repasas los puntos anteriores, verás que de una u otra forma, ya has realizado previamente todas estas operaciones. Sea como fuera, vamos a repasarlo.
Primero crea estos dos arrays, como te he indicado anteriormente,
distros1=(Ubuntu Knoppix PureOS)
distros2=(Mandrake CentOS Fedora)
Lo primero es unir unir dos arrays. Esto ya lo has hecho anteriormente, cuando has hecho el ejemplo de quitar un elemento intermedio. Pero de cualquier forma, la operación es la siguiente,
distros=(${distros1[@]} ${distros2[@]})
Si lo imprimes, utilizando echo ${distros[@]}
verás que el resultado es el que tue esperas.
Por otro lado, la operación de dividir un array, si que la recordarás porque la has hecho recientemente. Básicamente se trata de extraer los elementos que necesites. Si quiesieras los dos últimos elementos del array distros
, tan solo tienes que ejecutar nuevo=(${distros[@]:4)
. Lo cierto es que esto es poco intuitivo, porque necesitas saber el número total de elementos, y restar los que no queires extraer. La solución un poco aparatosa sería,
nuevo=(${distros[@]:$((${#distros[@]}-2))})
Desde luego, si quieres los dos primeros, es tan sencillo como,
nuevo=(${distros[@]::2}
Como de costumbre para comprobar el resultado, tan solo tienes que ejecutar echo ${nuevo[@]}
.
Por último, para borrar un array es similar como para borrar un elemento de un array, utilizando unset
. Así siguiendo con el ejemplo anterior, para borrar el array nuevo
, tienes que ejecutar,
unset nuevo
Conclusión
Antes de terminar recordarte que la manipulación de cadenas se hace exactamente igual, y lo puedes leer en manipulando texto en el terminal. Así por ejemplo, prueba con lo siguiente,
cadena="Supercalifragilisticexpialidocious"
echo ${cadena/i/u}
En el siguiente capítulo del tutorial vas a ver como trabajar con funciones. Básicamente, se trata de la definición y el uso de las mismas, con el objetivo de poder reutilizarlas y ahorrarte trabajo.
Más información,
Muy ameno el post, felicidades por el blog
Hola
Estoy siguiendo tu curso de bash y he visto este error:
distros=(«${distros[@]}:0:2» Arch «${distros[@]:3}»)
Probando lo cambie por esto y funciona:
distros=(«${distros[@]:0:2}» Arch «${distros[@]:2}»)
Gracias por el curso
Hola,
Tienes toda la razón, se me fue el corchete.
Muchas gracias. Corregido.
Buenas,
Muchas gracias por todo tu trabajo. Estoy haciendo este tutorial y pienso que sería bueno recordar que en los arrays el primer elemento se cuenta como 0. Y si un array tiene 6 elementos, por ejemplo, se numeran del 0 al 5. Es sólo una humilde sugerencia que creo puede hacer un poco más «entedible» para alguien que no sabe programar.
Muchas gracias de nuevo por todo tu trabajo.
enhorabuena
Muchas Gracias por el contenido… Solo escribo para agradecer…