Utilizar las comillas dobles con los Arrays de Bash
Obtener el tamaño de un array (Array length)
Eliminar una elemento de un array o borrar el array completo (delete)
Escribir un array en un archivo
Pasar un array como argumento a un función
Indexed Arrays
declare -a index_array
Associative Arrays
declare -A associative_array
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
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
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
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[*]}
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
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
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
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