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