I dizionari di Bash ti offrono mappe hash e array associativi negli script Shell Linux. Ti mostreremo come utilizzare queste strutture dati potenti e utili nei propri script Shell Linux.
Una rosa con qualsiasi altro nome
Il nome formale per i dizionari è matrici associative. Sono anche chiamati tavoli hash e mappe hash. Sono una struttura dati che funziona in modo simile a un array regolare, ma con una differenza significativa.
Un array è una raccolta di valori dati tenuti in una struttura dati. Per accedere a uno qualsiasi dei valori dei dati, che sono noti come elementi di array, è necessario conoscere la loro posizione nell'array. La posizione di un elemento di array nell'array è noto come indice, quindi questi tipi di array sono noti come array indicizzati. Sono il tipo di array più comunemente usato.
Tuttavia, hanno un inconveniente. Come accedi a un elemento di array se non si conosce la sua posizione all'interno dell'elenco? È necessario eseguire tutti gli elementi nell'array, testando per vedere se il valore in quella posizione è quello che stai cercando.
Gli array associativi superano tale problema. Non usano numeri interi per identificare in modo univoco elementi di array. Usano parole uniche conosciute come parole chiave. È possibile recuperare il valore per un elemento di array utilizzando la sua parola chiave, indipendentemente da dove è posizionato all'interno dell'array. Con un array indicizzato, i numeri interi che rappresentano le posizioni all'interno dell'array sono in ordine crescente. Le parole chiave in un array associativo possono essere in qualsiasi ordine.
Puoi cercare un valore in un array associativo cercando con la sua parola chiave. Guardando una parola e recuperando il suo valore associato mimiche che cerca una parola in un dizionario e trova il suo significato. Ecco perché gli array associativi sono noti come dizionari.
Bash 4.0 o superiore
Gli array associativi sono supportati in il guscio di bash. versione 4.0 o superiore. Se stai utilizzando una distribuzione attuale Linux, dovresti stare bene. Per controllare la versione bash, usa questo comando:
Bash --versione
La macchina utilizzata per la ricerca di questo articolo ha installato Bash 5.1.4, quindi siamo bravi a partire.
Principi di base
Per creare un array associativo sulla riga di comando del terminale o in uno script, utilizziamo il comando di dichiarare Bash. Il
-UN
L'opzione (associativa) dice a Bash che questo sarà un array associativo e non un array indicizzato.
Dichiara -a acronimi
Questo crea un array associativo chiamato "acronimi".
Per mettere alcuni dati nel nostro array, dobbiamo fornire parole chiave e valori. Possiamo farlo usando questo formato:
Nome array [tasto] = valore
Aggiungiamo alcuni elementi di array:
Acronimi [ACK] = Riconoscimento
Acronyms [BGP] = "Border Gateway Protocol"
Acronimi [cidr] = "instradamento inter-dominio senza classi"
Acronimi [DHCP] = "Protocollo di configurazione host dinamico"
Acronimi [EOF] = "Fine del telaio"
Quei comandi definiscono cinque elementi di array. Si noti che i valori sono avvolti in virgolette se ci sono spazi nel valore. Le nostre parole chiave sono state inserite in ordine alfabetico, ma possono essere inserite in qualsiasi ordine che ti piace. Le parole chiave devono essere univoche. Se si tenta di creare due voci con la stessa parola chiave, il secondo valore che inserisci sovrascriverà il primo. Avrai ancora solo una voce con quella parola chiave, e sarà associata al secondo valore aggiunto.
Per recuperare i valori dall'array, utilizziamo i comandi in questo formato:
$ {array-nome [tasto]}
Possiamo utilizzare ECHO per inviare l'uscita alla finestra del terminale:
Echo $ {acronimi [ACK]}
Echo $ {acronimi [DHCP]}
Usando loops.
Gli array si prestano ad essere utilizzati nei cicli molto bene. Gli array associativi non fanno eccezione. Loops forniscono modi efficaci per invocare una sequenza di azioni, senza sezioni ripetitive di codice. Prima di esaminare i cicli, c'è un modo efficiente per dichiarare gli array.
Creiamo le matrici che utilizzano il
dichiarare
comando (lo stesso
-UN
opzione come prima), ma forniamo parole chiave e valori come un elenco sulla riga di comando.
Paesi declare -a = ([ALB] = Albania [BHR] = Bahrain [CMR] = Camerun [DNK] = Danimarca [EGY] = Egitto)
Il nome di matrice è “paesi”, ed è collegata alla lista valori da un segno di uguale”
=.
. " La lista valori è avvolto tra parentesi “
()
”E ogni parola chiave è avvolto tra parentesi“
[]
“. Si noti che non ci sono le virgole che separano i valori. Se si dispone di una stringa valore che contiene spazi, sarà necessario avvolgerlo tra virgolette.
Per fare un array associativo restituire una parola chiave al posto del valore, aggiungere un punto esclamativo “
!
”Davanti al nome di matrice. Il al simbolo “
@
”Può essere usato come carattere jolly, cioè tutti gli elementi dell'array.
Questo
per
ciclo elencherà tutte le parole chiave:
per la chiave in "$ {paesi [@]}!"; do echo $ chiave; fatto
Si noti che le parole chiave non sono necessariamente elencati nell'ordine in cui sono stati creati, ma questo non importa. array associativi non si basano su un indice ordinato.
Possiamo anche usare l'espansione di parametro per elencare tutte le parole chiave. Saranno elencati su una riga, non uno per riga.
echo "$ {! Paesi [@]}"
echo "$ {! Acronimi [@]}"
Siamo in grado di aumentare la nostra
per
ciclo per stampare le parole chiave e valori allo stesso tempo.
per la chiave in "$ {acronimi [@]!}"; do echo "$ key - $ {acronimi [$ key]}"; fatto
Se vogliamo sapere quanti elementi ci sono nelle matrici, possiamo usare un cancelletto “#” davanti al nome di matrice invece che un punto esclamativo.
echo "$ {! Paesi [@]}"
echo "$ {! Acronimi [@]}"
Controllando che una matrice elemento esiste
Se si cerca una parola chiave, ma non v'è tale elemento dell'array, il valore di ritorno sarà una stringa vuota. A volte è utile disporre di un indicatore diverso per la presenza o l'assenza di un elemento di matrice.
Possiamo verificare la presenza di un elemento di matrice utilizzando la “
+ _
”Operatore. Si noti che questo viene dopo la parola chiave, non davanti al nome di matrice come i precedenti operatori che abbiamo visto.
if [$ {acronimi [EOF] + _}]; then echo "Trovato"; else echo "Non trovato"; fi
if [$ {acronimi [FTP] + _}]; then echo "Trovato"; else echo "Non trovato"; fi
L'elemento di matrice della parola “EOF” si trova nella matrice, ma l'elemento di matrice della parola “FTP” non è.
Aggiunta di elementi di matrice
L'aggiunta di nuovi elementi ad un array associativo è facile. A differenza di alcuni linguaggi di programmazione, non è necessario per definire la dimensione dell'array quando lo si dichiara. È possibile continuare ad aggiungere nuovi elementi senza colpire un limite superiore predefinito.
Per aggiungere un nuovo elemento alla matrice, si usa il “
+ =
”Operatore.
i paesi + = ([FJI] = Figi)
echo "$ (# paesi [@]}"
echo $ {paesi [FJI]}
Il numero di elementi nella matrice è ora a sei, e cercando la nuova parola chiave trova l'elemento di matrice e restituisce il suo valore.
Rimozione elementi di matrice e Arrays
Il
non settato
comando viene utilizzato per rimuovere elementi dell'array. Se la parola chiave ha spazi, avvolgerlo in virgolette.
unset acronimi [EOF]
if [$ {acronimi [EOF] + _}]; then echo "Trovato"; else echo "Non trovato"; fi
Per rimuovere l'intera matrice, uso
non settato
con il nome della matrice.
Paesi unset
Utilizzo delle variabili con le matrici
Utilizzando le variabili array associativi è semplice. In questo esempio, verrà impostato un tasto di variabile per la stringa “EOF”. Useremo la variabile quando aggiungiamo un nuovo elemento della matrice alla matrice. In realtà, stiamo sostituendo l'elemento dell'array che abbiamo eliminato in precedenza.
Recupereremo il nuovo elemento Array chiamandolo con la nuova parola chiave e anche utilizzando la variabile. Se la parola chiave contiene spazi, è necessario avvolgere il nome della variabile nelle virgolette.
Key = EOF
Acronimi [$ key] = "Fine del telaio"
Echo $ {acronimi [EOF]}
Echo $ {acronimi [$ key]}
Diventa creativo
I nostri esempi sono stati raccolte di informazioni in cui ogni elemento di array è indipendente da tutti gli altri, molto come un dizionario. Ognuno è una definizione unica. Ma gli array associativi possono solo contenere facilmente una varietà di informazioni relative a una cosa, come le specifiche di diversi pezzi di hardware del computer:
Dichiara -A Specifica
Specifiche [CPU] = "Dual Core AMD Ryzen 5 3600"
Specifica [Speed] = "3600 MHz"
Specifiche [kernel] = "5.11.0-17-generico x86_64"
Specifiche [MEM] = "1978,5 MIB"
Specifiche [Storage] = "32 GIB"
Specifica [shell] = "bash"
Echo $ {specifica [CPU]}
Scrivere in modo efficiente in una lingua significa conoscere i meccanismi e le strutture che offre e selezionando il più appropriato per il problema che stai cercando di risolvere. Gli array associativi ti danno un modo di memorizzare i dati di facile utilizzo che puoi cercare per nome, proprio come un dizionario.