Bash Script,s Arrays


Índice:

   Fuentes

   Tipos de arrays

   Utilizar las comillas dobles con los Arrays de Bash

   Operaciones con arrays

      Iterar sobre un array de Bash

      Obtener el tamaño de un array (Array length)

      Eliminar una elemento de un array o borrar el array completo (delete)

      Leer un archivo en un array

      Escribir un array en un archivo

      Array insert function

      Pasar un array como argumento a un función



Fuentes  ⮴  


Tipos de arrays  ⮴  


Utilizar las comillas dobles con los Arrays de Bash  ⮴  

Un gran beneficio de usar Bash Arrays es preservar la separación de campos.

Sin embargo, para mantener ese comportamiento, debe utilizar las comillas

dobles cuando sea necesario. En ausencia de comillas, Bash dividirá la en-

trada en una lista de palabras basada en el valor $IFS que por defecto con-

tiene espacios y tabulaciones.


      [me@linux ~]$ myArray=("1st item" "2nd item" "3rd item" "4th item")

      [me@linux ~]$ printf 'Word -> %s\n' ${myArray[@]} # word splitting based on $IFS

      Word -> 1st

      Word -> item

      Word -> 2nd

      Word -> item

      Word -> 3rd

      Word -> item

      Word -> 4th

      Word -> item

      [me@linux ~]$ printf 'Word -> %s\n' "${myArray[*]}" # use the full array as one word

      Word -> 1st item 2nd item 3rd item 4th item

      [me@linux ~]$ printf 'Word -> %s\n' "${myArray[@]}" # use arrays entries

      Word -> 1st item

      Word -> 2nd item

      Word -> 3rd item

      Word -> 4th item


Operaciones con arrays  ⮴  


Iterar sobre un array de Bash  ⮴  

Se puedes acceder a todos los valores de un array de Bash utilizando la no-

tación * (asterisco). Sin embargo, para iterar a través de todos los valo-

res de la matriz debe utilizar la notación @ (arroba) en su lugar.

La notación * devolverá todos los elementos del array como resultado de

una sola palabra mientras que la notación @ devolverá un valor para cada

elemento del array Bash como una palabra separada.


        [me@linux ~]$ myDemoArray=(1 2 3 4 5)


        // Using '*'

        // For Loop Exampe with '*', will echo only once all the values

        [me@linux ~]$ myDemoArray=(1 2 3 4 5)

        [me@linux ~]$ for value in "${myDemoArray[*]}"; do echo "$value"; done

        1 2 3 4 5


        // Using '@'

        // For Loop Example with '@', will echo individually each values

        [me@linux ~]$ myDemoArray=(1 2 3 4 5)

        [me@linux ~]$ for value in "${myDemoArray[@]}"; do echo "$value"; done

        1

        2

        3

        4

        5


Ejemplos

Our example array:

        arr=(a b c d e f)


Using a for..in loop:

        for i in "${arr[@]}"; do

            echo "$i"

        done


Using C-style for loop:

        for ((i=0;i<${#arr[@]};i++)); do

            echo "${arr[$i]}" 

        done


Using while loop:

        i=0

        while [ $i -lt ${#arr[@]} ]; do

            echo "${arr[$i]}"

            i=$((i + 1))

        done


Using while loop with numerical conditional:

        i=0

        while (( $i < ${#arr[@]} )); do

            echo "${arr[$i]}"

            ((i++))

        done


Using an until loop:

        i=0

        until [ $i -ge ${#arr[@]} ]; do

            echo "${arr[$i]}"

            i=$((i + 1))

        done


Using an until loop with numerical conditional:

        i=0

        until (( $i >= ${#arr[@]} )); do

            echo "${arr[$i]}"

            ((i++))

        done


Obtener el tamaño de un array (Array length)  ⮴  

Otro aspecto útil de la manipulación de los Arrays de Bash es poder obtener

la cuenta total de todos los elementos de un array. Puedes obtener la longi-

tud de una variable Array con la notación # (hashtag).


        [me@linux ~]$ myArray=(a b c d)

        [me@linux ~]$ echo "myArray contain ${#myArray[*]} elements"

        myArray contain 4 elements


Eliminar una elemento de un array o borrar el array completo (delete)  ⮴  

El comando unset se utiliza para borrar o eliminar cualquier valor y atri-

buto de una variable o función del shell. Esto significa que puedes usarlo

simplemente para borrar un array en su totalidad o sólo eliminar parte de

él especificando la clave. Unset toma el nombre de la variable como argu-

mento, así que no olvides eliminar el signo $ (dólar) delante del nombre

de la variable de tu array.


        [me@linux ~]$ declare -a myArray=(uno dos tres)

        [me@linux ~]$ echo ${myArray[*]}

        uno dos tres

        // Eliminar el elemento que ocupa la posición 1 (elemento inicial 0)

        [me@linux ~]$ unset myArray[1]

        [me@linux ~]$ echo ${myArray[*]}

        uno tres

        // Eliminar el array completo

        [me@linux ~]$ unset myArray

        [me@linux ~]$ echo ${myArray[*]}



Leer un archivo en un array  ⮴  

La forma más fácil y segura almacenar cada línea de un archivo en una matriz

indexadade es utilizar mapfile que lee líneas de la entrada estándar. Cuando

no se proporciona un nombre de variable de matriz al comando mapfile, la en-

trada se al macenará en la variable $MAPFILE. Tenga en cuenta que el comando

mapfile dividirá por defecto el carácter de nueva línea pero lo conservará en

los valores del array, puede eliminar el delimitador final utilizando la op-

ción -t y cambiar el delimitador utilizando la opción -d.


        [me@linux ~]$ mapfile MYFILE < example.txt

        [me@linux ~]$ printf '%s' "${MYFILE[@]}"

        line 1

        line 2

        line 3

        [me@linux ~]$ mapfile < example.txt # Use default MAPFILE array

        [me@linux ~]$ printf '%s' "${MAPFILE[@]}"

        line 1

        line 2

        line 3


Escribir un array en un archivo  ⮴  

La opción más cercana y directa es printf '%s\n' "${array[@]}", ya que es la ope-

ración inversa: convierte un array de vuelta a líneas en la salida estándar o en

un archivo.

    printf '%s\n' "${miarray[@]}" > salida.txt


Array insert function  ⮴  

Esta función inserta un elemento en un array en un índice determinado.


      insert(){

        declare -n __arr__=$1   # reference to the array variable

        i=$2                    # index to insert at

        el="$3"                 # element to insert

        // handle errors

        [[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }

        (( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }

        // Now insert $el at $i

        __arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")



Uso:


      insert array_variable_name index element


Ejemplo:


      arr=(a b c d)

      echo "${arr[2]}" # output: c

      // Now call the insert function and pass the array variable name,

      // index to insert at

      // and the element to insert

      insert arr 2 'New Element'

      // 'New Element' was inserted at index 2 in arr, now print them

      echo "${arr[2]}" # output: New Element

      echo "${arr[3]}" # output: c    


Pasar un array como argumento a un función  ⮴  

Dos formas:


a)

          #!/bin/bash


          function c() {

              local l_name=$1[@]

              local l_array=("${!l_name}")

              local l_i


              for l_i in "${l_array[@]}" ; do

                  echo "$l_i"

              done



          #declare -a aLista


          aLista[0]="/home/juanp/Documentos/Banco/"

          aLista[1]="/home/juanp/Documentos/dock/"

          aLista[2]="/home/juanp/Documentos/Medicos/"

          aLista[3]="/home/juanp/Documentos/Renta/"

          aLista[4]="/home/juanp/Documentos/Diego/"

          aLista[5]="/home/juanp/Documentos/Juan_Diego/"

          aLista[6]="/home/juanp/Documentos/Pablo/"

          aLista[7]="/home/juanp/Documentos/Suegros/"



          c aLista


b)


          #!/bin/bash


          function c() {

              local -n l_array=$1

              local l_i


              for l_i in "${l_array[@]}" ; do

                  echo "$l_i"

              done



          #declare -a aLista


          aLista[0]="/home/juanp/Documentos/Banco/"

          aLista[1]="/home/juanp/Documentos/dock/"

          aLista[2]="/home/juanp/Documentos/Medicos/"

          aLista[3]="/home/juanp/Documentos/Renta/"

          aLista[4]="/home/juanp/Documentos/Diego/"

          aLista[5]="/home/juanp/Documentos/Juan_Diego/"

          aLista[6]="/home/juanp/Documentos/Pablo/"

          aLista[7]="/home/juanp/Documentos/Suegros/"



          c aLista