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