Saltar al contenido principal
Página

Tema 2.9 - Arrays y Funciones

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)


Mostrar todos los elementos del array
Si queremos mostrar el array completo podemos usar este sencillo comando:
echo ${numeros[@]}

También se puede usar con un asterisco en lugar de la arroba
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).


Acceder a un elemento del array Si queremos acceder a un elemento del array podemos usar la forma:
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 error
echo ${numeros[10]}

De forma similar podemos cambiar un elemento del array
#!/bin/bash
 
numeros=(1 2 3 4 5)
numeros[1]="Cambiado"
echo ${numeros[*]}

Este script mostrará el siguiente resultado:
1 Cambiado 3 4 5

También podemos añadir nuevos elementos:
#!/bin/bash
 
numeros=(1 2 3 4 5)
numeros[5]=6
echo ${numeros[*]}

Lo anterior mostrará:
1 2 3 4 5 6

Si usamos un índice con un número mayor el resultado será, aparentemente, el mismo:
#!/bin/bash
 
numeros=(1 2 3 4 5)
numeros[10]=6
echo ${numeros[*]}

Esto mostrará:
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


También podemos usar este método para crear un nuevo array:
#!/bin/bash

numeros[0]=1
numeros[1]=2


Índices de un array en BASH

Podemos ver qué índice tiene cada elemento del array usando:
echo ${!numeros[*]}

Usado en el ejemplo anterior quedaría:
#!/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[*]}

El tamaño de un elemento
Podemos conocer directamente el tamaño de un elemento del array usando la # al acceder a dicho elemento:
#!/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[*]}

Por supuesto podemos usar los rangos empezando en la letra o el número que queramos
#!/bin/bash
 
cifrasLetras=( {N..X} {b..m} {6..11} )
echo ${cifrasLetras[*]}

Que resultará en:
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.


RANGOS


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í,

  • {1..1000} contará de 1 a 1000
  • {1000..1} contará de 1000 a 1
  • {A..Z} todas las etras desde la A hasta la Z

Pero, no solo puedes decir que cuente de uno en uno, también le puedes definir paso. Así

  • {1..1000..2} contará de 1 a 1000, pero, de dos en dos.
  • {1000..1..-2}, lo mismo que en el caso anterior, pero de forma regresiva

Los rangos pueden ser utilizados en arrays, bucles etc.




FUNCIONES


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.
}

Ejemplo: Función para limpiar la pantalla
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.
Creamos las funciones:
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


Última modificación: lunes, 11 de mayo de 2020, 22:15