Bash: array associativi e come copiarli

Tags: 

La bash ha il supporto sia per gli array a indice numerico che per gli array associativi. Vediamo come usarli.

Array a indice numerico

Per quanto riguarda i primi è possibile usare queste forme per la dichiarazione:

var[index]=value

var(value1 value2 value3...)

(in questo caso il primo indice parte da "0")

var([index1]=value1 [index2]=value2 ...)

Ad esempio, questi comandi generano la stessa variabile:

test[1]=one
test[2]=two
echo ${test[1]}
unset test
test=([1]=one [2]=two)
echo ${test[1]}

E' possibile usare anche la forma "+=" per aggiungere un array a un altro.

var += ([index]=value ...)

Da notare che è possibile dichiarare una variabile come array usando la forma:

declare -a var

(Ma la cosa non ha grande utililità).

Per vedere il contenuto di un array occorre sempre usare la forma con le parentesi graffe {}. Quindi

echo ${test[1]}

e NON:

echo $test

Stampare il valore della variabile senza indice equivale a stampare il valore con indice [0]:

echo $var equivale a echo ${var[0]}

Usare un indice negativo permette di prendere i dati scorrendo l'indice dal fondo. In pratica:

${var[-1]}

equivale a prendere l'ultimo elemento dell'array.

${var[*]}

Ottiene l'elenco di tutti i valori dell'array (è possibile usare anche ${var[@]}, che fa la stessa cosa ma con una espansione diversa all'interno degli apici).

${#var[*]}

Ottiene il numero di elementi nell'array.

${!var[*]}

Ottiene l'elenco di indici dell'array.

Array associativi

Gli array associativi si dichiarano e usano alla stessa maniera di quelli precedenti: l'unica differenza fondamentale è che la dichiarazione esplicita è obbligatoria (in caso contrario vengono presi come array numerici e praticamente non vengono correttamente assegnati).

La dichiarazione avviene con:

declare -A var

Eventualmente già con la valorizzazione

declare -A var=([index1]=value1 [index2]=value2 ...)

Quindi questi comandi generano lo stesso array

declare -A test
test[one]="1 one"
test[two]="2 two"
echo ${test[one]}
declare -A test=(
  [one]="1 one"
  [two]="2 two"
)
echo ${test[one]}

Gli altri comandi sono gli stessi.

Da notare che non è possibile creare array multidimensionali.

Copia di array

Non è possibile copiare gli array con un semplice var1=var2. Non funziona.

Abbiamo 2 modi per fare la copia: ciclare attraverso gli elementi o duplicare la generazione.

for key in "${!var1[@]}" 
do
  var2["$key"]="${var1["$key"]}"
done

Oppure:

var1dec=$(declare -p var1)
eval "declare -A var2="${var1dec#*=}

Questo secondo metodo è particolarmente flessibile, in quanto il nome della variabile ("var1") potrebbe anche essere dentro un'altra variabile stringa ("$VARNAME"), cosa che con il primo metodo non è possibile (la "variable indirection" non è possibile sugli array).

Aggiungi un commento