6 Array in bash

Gli Array sono un tipo di dato che contiene degli elementi che vengono ordinati tramite un indice sequenziale.

Si definisce un array, nello stesso modo con cui si definisce una variabile, con i valori racchiusi tra parentesi tonde

my_array=(1 240 "item3")

printf "Stampa individuale degli elementi dell'array:\n"

Questo è un esempio di array che contiene 3 elementi. Invochiamo gli elementi dell’ array tramite il suo indice numerico, la serie incomincia dall’indice 0 ( zero ). Il nome dell’array viene racchiuso da parentesi graffe dopo il simbolo del dollaro ( $ ), mentre il l’indice in parentesi quadre.

printf ${my_array[0]}

possiamo richiamare più elementi nello stesso comando racchiudendoli tra doppi apici e separandoli da virgola

printf "${my_array[0]}, ${my_array[1]}, ${my_array[2]}\n"

possiamo invocare tutti gli elementi di un array utilizzando l’asterisco all’interno delle parentesi quadre, al posto del numero dell’indice

printf "Tutto il contenuto: ${my_array[*]}\n"

Per iterare gli elementi dell’array, possiamo richiamare l’array inserendo il simbolo chiocciola tra le parentesi quadre per poi iterare gli elementi per esempio con un loop for

printf "itermiamo gli elementi\n"
for i in ${my_array[@]}
do
  echo $i
done

assegniamo ora una serie di numeri pari utilizzando un while

printf "Aggiungo i numeri pari fino a 2000\n"
temp=0
while [ $temp -le 2000 ]; do
  mio_array+=($temp)
  let temp+=2
done
printf "Fatto\n\n"

per vedere il numero di elementi presenti nell’array basta aggiungere davanti all’invocazione il simbolo del cancelletto ( hash # ) e tra quadre la chiocciola o l’asterisco

printf "mio_array ha ${#mio_array[@]} elementi\n"

se vogliamo stampare gli elementi dell’array tramite il riferimento della lunghezza possiamo utilizzare un ciclo while

temp=0
while [ $temp -le ${#mio_array[@]} ]; do
  echo "${mio_array[$temp]}"
  let temp++
done

Per richiamare l’indice stesso dell’array possiamo utilizzare il punto esclamativo ( ! ) al posto dell’ash, questo è importante quando parleremo degli array associativi

printf "Riferimento dell'indice dell'array:\n"
for index in ${!mio_array[@]}; do
  echo "Indice: $index, elementi: ${mio_array[$index]}"
done

array associativi

Gli array associativi permettono di definire una parola arbitraria come indice degli elementi, al posto del numero sequenziale.

Bash non è un linguaggio fortemente tipizzato, occorre però fare delle dichiarazioni sul tipo, quando i valori possono cambiare da un tipo ad un altro o in quelle situazioni ambigue sul tipo di dato. Anche per gli array associativi occorre dichiararne il tipo tramite la keyword declair, in alcune versioni di bash potrebbe essere necessario type set oppure nessuna dichiarazione

declare -A giorni_nel_mese

l’opzione -A indica che giorni_nel_mese è un array associativo. La parola che vogliamo assegnare nell’indica va specificata nelle parentesi quadrate

giorni_nel_mese[giugno]=30
giorni_nel_mese[luglio]=31

echo "Giugno ha ${giorni_nel_mese[giugno]} giorni"
echo "Luglio ha ${giorni_nel_mese[luglio]} giorni"

L’indice viene chiamato chiave mentre l’elemento valore e questa famiglia di tipi di dato vengono comunemente chiamati chiave valore

Vediamo come iterare gli array associativi con il for

declare -A nato

nato[a]="alpha"
nato[b]="bravo"
nato[c]="charlie"
nato[d]="delta"
nato[e]="echo"
nato[f]="foxtrot"

for ele in ${nato[@]}; do
  echo $ele
done

è possibile anche richiamare gli indici degli array che adesso saranno le chiavi definite tra le quadre

for letter in ${!nato[@]}; do
  echo "${letter}: ${nato[$letter]}"
done

e anche per gli array associativi possiamo determinarne la sua lunghezza utilizzando il cancelletto

echo "La lunghezza di nato è ${#nato[@]}"

Ora abbiamo le basi per poter automatizzare qualsiasi operazione con la bash linux/unix insieme ai comandi bash