Introduzione

Gli Array sono una delle strutture di dati più utilizzate e fondamentali. Puoi pensare a un array è una variabile che può memorizzare più variabili al suo interno.

In questo articolo, tratteremo gli array Bash e spiegheremo come usarli negli script Bash.

Bash Arrays

Bash supporta tipi di array unidimensionali indicizzati numericamente e associativi. Gli array numerichi sono referenziate usando numeri interi e le associazioni sono referenziate usando stringhe.

Gli array indicizzati numericamente sono accessibili dall'estremità usando indici negativi, l'indice di -1 è un riferimento dell'ultimo elemento. Gli indici non devono essere contigui.

A differenza della maggior parte dei linguaggi di programmazione, gli elementi dell'array Bash non devono essere dello stesso tipo di dati. È possibile creare un array che contiene sia stringhe che numeri.

Bash non supporta array multidimensionali e non è possibile avere elementi array che sono anche array.

Non esiste un limite al numero massimo di elementi che possono essere memorizzati in un array.

Gli array in Bash possono essere inizializzate in diversi modi.

Creare array indicizzati numericamente

Le variabili di Bash non sono tipizzate, qualsiasi variabile può essere utilizzata come array indicizzata senza dichiararla.

Per dichiarare esplicitamente un array, utilizzare la funzione integrata declare:

declare -a array_name

Un modo per creare un array indicizzato è utilizzando il seguente modulo:

array_name[index_1]=value_1
array_name[index_2]=value_2
array_name[index_n]=value_n

Dove index_* è un numero intero positivo.

Un altro modo per creare un array numerico è specificare l'elenco degli elementi tra parentesi, separati da uno spazio vuoto:

array_name=( element_1 element_2 element_N )

Quando l'array viene creato utilizzando il modulo sopra, l'indicizzazione inizia da zero, ovvero il primo elemento ha un indice di 0.

Creare array associativi

A differenza dell'indicizzazione numerica, gli array associativi devono essere dichiarati prima di poter essere utilizzati.

Per dichiarare un array associativo usa l'integrato declare con l'opzione -A (maiuscola):

declare -A array_name

Gli array associativi possono essere creati utilizzando il seguente modulo:

declare -A array_name

array_name[index_foo]=value_foo
array_name[index_bar]=value_bar
array_name[index_xyz]=value_xyz

Dove index_* può essere qualsiasi stringa.

È inoltre possibile creare un array associativo utilizzando il modulo seguente:

declare -A array_name

array_name=( 
  [index_foo]=value_foo 
  [index_bar]=value_bar 
  [index_xyz]=value_xyz 
)

Operazioni su array

La sintassi degli array di Bash all'inizio può sembrare un po' strana, ma avrà più senso una volta letto questo articolo.

Elementi di riferimento

Per fare riferimento a un singolo elemento, è necessario conoscere l'indice degli elementi.

È possibile fare riferimento a qualsiasi elemento utilizzando la sintassi seguente:

${array_name[index]}
La sintassi per l'accesso a un elemento array è simile alla sintassi della maggior parte dei linguaggi di programmazione. Le parentesi graffe ${} sono necessarie per evitare gli operatori di espansione del nome file della shell.

Stampiamo l'elemento con indice di 1:

## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## print element
echo ${my_array[1]}
Helium

Se si utilizza @ o * come indice, la parola si espande a tutti i membri dell'array. Per stampare tutti gli elementi che dovresti usare:

## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium

L'unica differenza tra @ e * è quando il modulo ${my_array[x]} è racchiuso tra virgolette doppie. In questo caso, * si espande in una singola parola in cui gli elementi dell'array sono separati con lo spazio. @ espande ogni elemento dell'array in una parola separata. Ciò è particolarmente importante quando si utilizza il modulo per analizzare gli elementi dell'array.

Per stampare le chiavi dell'array aggiungere l'operatore ! prima del nome dell'array:

${!array_name[index]}

Ecco un esempio:

## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## print all elements
echo "${!my_array[@]}"
0 1 2 3

Lunghezza degli array

Per ottenere la lunghezza di un array, utilizzare il modulo seguente:

${#array_name[@]}

La sintassi è la stessa di quando si fa riferimento a tutti gli elementi con l'aggiunta del carattere # prima del nome dell'array.

## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## array Length
echo ${#my_array[@]}
4

Passare attraverso l'array

Il modo più comune di scorrere su ogni elemento di un array è utilizzare il ciclo for:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## Array Loop
for i in "${my_array[@]}"
do 
  echo "$i"
done

Il codice in alto ripeterà l'array e stamperà ogni elemento in una nuova riga:

Hydrogen
Helium
Lithium
Beryllium

Ecco un esempio di come stampare tutte le chiavi e i valori:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## Array Loop
for i in "${!my_array[@]}"
do
  echo "$i" "${my_array[$i]}"
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium

Un altro modo per eseguire il loop in un array è ottenere la lunghezza dell'array e utilizzare il loop C style:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

# Length of the array
length=${#my_array[@]}

# Array Loop
for (( i=0; i < ${length}; i++ ))
do
  echo $i ${my_array[$i]}
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium

Aggiungere un nuovo elemento

Per aggiungere un nuovo elemento a un array bash e specificarne l'indice, utilizzare il seguente modulo:

my_array[index_n]="New Element"

Ecco un esempio:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## add new element
my_array[9]="Aluminum"

## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum

Un altro modo per aggiungere un nuovo elemento a un array senza specificare l'indice consiste nell'utilizzare l'operatore +=. Puoi aggiungere uno o più elementi:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## add new elements
my_array+=( Cobalt Nickel )

## print all elements
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel

Eliminare un elemento

Per eliminare un singolo elemento, devi conoscere l'indice degli elementi. Un elemento può essere rimosso usando il comando unset:

unset my_array[index]

Vediamo un esempio:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## remove element
unset my_array[2]

## print all elements
echo "${my_array[@]}"
Hydrogen Helium Beryllium

Conclusione

Abbiamo spiegato come creare array numericamente indicizzate e associative. Abbiamo anche mostrato come scorrere gli array, calcolare la lunghezza dell'array e aggiungere e rimuovere elementi.