sábado, septiembre 16, 2017

Tutorial de arrays - vectores - en Bash

Bash es un shell - intérprete de órdenes de consola , interfaz clásica en modo texto - que fue desarrollado bajo el paraguas del proyecto GNU. Es compatible con Bourne Shell, la interfaz de comandos que traía la versión 7 de Unix. Además, tiene muchas mejoras y extensiones. Una de ellas es la posibilidad de usar arrays.

Un array puede declararse de cuatro maneras diferentes en Bash. La manera más sencilla es la siguiente, se muestra las órdenes y la salida de los echo:

$ my_array=("cadena 1" "cadena 2" "cadena 3")
$ echo ${my_array[@]}
cadena 1 cadena 2 cadena 3
$ echo ${!my_array[@]}
0 1 2
$ echo ${my_array[1]}
cadena 2
$ echo ${my_array[10]}

$ echo ${my_array} 
cadena 1
$ echo ${#my_array[@]}
3
$ declare -p my_array
declare -a my_array='([0]="cadena 1" [1]="cadena 2" [2]="cadena 3")'

Del ejemplo anterior se pueden ver los siguientes puntos sobre la sintaxis que usa Bash para gestionar los arrays:

  • La construcción ${nombreArray[@]} devuelve el array completo.
  • Para obtener la longitud del array se usa ${#nombreArray[@]}.
  • Se accede a cualquier elemento del array con ${nombreArray[indice]}, donde indice es un entero mayor o igual a cero. Si el elemento que se pide no existe, no se devuelve nada.
  • La construcción ${!nombreArray[@]} devuelve un array con los índices de cada elemento. Bash permite que el índice de cada elemento no sea correlativo ni tenga que empezar en 0.
  • Por último con ayuda de declare -p nombreArray pueden verse los atributos del array.

Otra manera de declarar una variable con un subíndice determinado, se crea autmáticamente un array. En el siguiente ejemplo creará un array llamado my_array donde el elemento número 11 tendrá el valor Número 11

$ my_array[10]="Número 11"
$ my_array[11]="Número 12"
$ echo ${my_array[@]}
Número 10 Número 11
$ echo ${!my_array[@]}
10 11
$ declare -p my_array
declare -a my_array='([10]="Número 10" [11]="Número 11")'

Otra manera de declarar un array es hacerlo explícitamente con declare y añadir elementos:

$ declare -a my_array
$ my_array[0]="Cero"

Un array puede ser borrado usando el comando unset nombreArray o unset nombreArray[@].

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ unset my_array
$ echo echo ${my_array[@]}} # Sólo salto de línea

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ unset my_array[@]
$ echo  ${my_array[@]} # Sólo salto de línea

Por último, hacere referencia a las dobles comillas. Como se ha visto a lo largo de los ejemplos anteriores, se usa ${nombreArray[@]} para referirse a todos los elementos del array. También se puede usar el asterisco (*) en vez del símbolo at (@): ${nombreArray[*]}. El comportamiento es el mismo execepto cuando se emplea dentro de comillas dobles. Si se usa el asterisco (*) , la expansión se realizará a una sóla palabra separada por el primer caracter del IFS - internal field separator. Mientras que si se usa el símbolo at (@), expande a varias palabras:

$ my_array=(1 2 3 4 5)
$ echo ${my_array[@]}
1 2 3 4 5
$ echo ${my_array[*]}
1 2 3 4 5
$ echo "${my_array[@]}"
1 2 3 4 5
$ echo "${my_array[*]}"
1 2 3 4 5
$ IFS=";"
$ echo "${my_array[@]}"
1 2 3 4 5
$ echo "${my_array[*]}" 
1;2;3;4;5

Un pequeño ejemplo de lo anterior es este shell script de ejemplo con todo lo anterior

#!/bin/bash
# Declarar el array
cities=("Menzoberrazan" "Waterdeep" "Neverwinter" "Baldur's Gate")

# Imprime cada elemento
for city in "${cities[@]}"; do
    echo "$city"
done
# Imprime los índices
for index in "${!cities[@]}"; do
    echo "$index ${cities[$index]}"
done
# Imprime el tamaño
echo "Longitud array: ${#cities[@]}"

Referencias

No hay comentarios: