En Bash tenemos la posibilidad de usar arrays. Un array es una variable con varios elementos y tienen muchísima utilidad. Por ejemplo, para recoger el listado de archivos que hay en una carpeta.
Para crear un array hay varias formas, una de ellas es definir la variable del array y añadirle todos los elementos de golpe:
#!/bin/bash numeros=(1 2 3 4 5)
Este script creará un array con cinco elementos (del 1 al 5).
También se puede usar esta otra forma:#!/bin/bash declare -a numeros=(1 2 3 4 5)
echo ${numeros[@]}
echo ${numeros[*]}
El $ es el símbolo que se usa para referirnos a las variables, las llaves son necesarias siempre que queremos acceder a los valores de un array y, por último, entre corchetes va el índice del elemento al que queremos acceder (en este caso el '*' se refiere a todos los elementos).
echo ${numeros[0]}
Al igual que sucede en la mayoría de los lenguajes de programación el primer elemento del array tiene el índice 0. Este ejemplo nos mostraría, por tanto, un 1.
Nota: Bash no comprueba los límites de un array. Es posible hacer algo así sin tener ningún errorecho ${numeros[10]}
#!/bin/bash numeros=(1 2 3 4 5) numeros[1]="Cambiado" echo ${numeros[*]}
1 Cambiado 3 4 5
#!/bin/bash numeros=(1 2 3 4 5) numeros[5]=6 echo ${numeros[*]}
1 2 3 4 5 6
#!/bin/bash numeros=(1 2 3 4 5) numeros[10]=6 echo ${numeros[*]}
1 2 3 4 5 6
La diferencia está en que, ahora, el 6 es el elemento con índice 10 y no índice 5 como tenía en el ejemplo anterior
#!/bin/bash numeros[0]=1 numeros[1]=2
echo ${!numeros[*]}
#!/bin/bash numeros=(1 2 3 4 5) numeros[10]=6 echo "Contenido del array: " echo ${numeros[*]} echo "Indices del array: " echo ${!numeros[*]}
Y mostraría como resultado:

Número de elementos en un array
Añadiendo el símbolo '#' tenemos el tamaño del array:#!/bin/bash numeros=(1 2 3 4 5) echo ${#numeros[*]}
#!/bin/bash numeros=(Primero Segundo Tercero) echo ${#numeros[1]}
El resultado será un 7, que es el número de letras de la palabra “Segundo”.
Ahorrando tiempo al crear un array
Cuando creamos un array podemos ahorrarnos un montón de trabajo usando rangos (Los veremos mas detalladamente en otra sección):
#!/bin/bash cifrasLetras=( {A..Z} {a..z} {0..9} ) echo ${cifrasLetras[*]}
#!/bin/bash cifrasLetras=( {N..X} {b..m} {6..11} ) echo ${cifrasLetras[*]}
N O P Q R S T U V W X b c d e f g h i j k l m 6 7 8 9 10 11
Un ejemplo real: meter el listado de archivos en un array
Algo bastante habitual suele ser meter un listado de archivos en un array y luego poder trabajar con ese array. Se puede hacer usando el comando ls dentro de unas comillas invertidas:
#!/bin/bash ficheros=(`ls`) echo ${ficheros[*]} echo ${#ficheros[*]}
En la variable ficheros tendríamos el listado de los archivos y veríamos que el tamaño del array coincide con el número de archivos.
Un rango, lo puedes expresar con un número de inicio y un número de fin (También mediante las letras del abecedario lo puedes hacer). Sin embargo, Bash, es lo suficientemente inteligente, como para interpretar que si el número de inicio, es mayor que el número de fin, lo que tiene que hacer es una cuenta regresiva. Así,
Pero, no solo puedes decir que cuente de uno en uno, también le puedes definir paso. Así
Los rangos pueden ser utilizados en arrays, bucles etc.
Una función en BASH es una porción de código declarada al principio del programa, que puede recoger parámetro de entrada y que puede ser llamada desde cualquier punto del programa principal o desde otra función, tantas veces como sea necesario. El uso de funciones permite crear un código más comprensible y que puede ser depurado más fácilmente, ya que evita posibles errores tipográficos y repeticiones innecesarias. Los parámetros recibidos por la función se tratan dentro de ella del mismo modo que los del programa principal, o sea los parámetros posicionales de la función se corresponden con las variables internas $0, $1, etc
Las funciones se pueden definir de la siguiente forma:
function nombre_funcion { # Comandos o instrucciones bash. }
function borrarPantalla { clear }
La función ejecuta el bloque de código encerrado entre sus llaves y –al igual que un programa– devuelve un valor numérico. En cualquier punto del código de la función, y normalmente al final, puede usarse la cláusula return para terminar la ejecución y opcionalmente indicar un código de salida.
Las variables declaradas con la cláusula local tienen un ámbito de operación interno a la función. El resto de variables pueden utilizarse en cualquier punto de todo el programa. Esta característica permite crear funciones recursivas sin que los valores de las variables de una llamada interfieran en los de las demás.
Invocando funciones
Para invocar a una función simplemente se ha de usar su nombre.function borrarPantalla { clear } function listarETC { ls /etc } function crearDirectorio { mkdir directorio }
Invocamos las funciones:
read -p "Ingrese una opcion" opcion case $opcion in b|B) limpiarPantalla ;; l|L) listarETC ;; c|C) crearDirectorio ;; *) echo "Opcion Invalida" ;; esac