Cosa sono i dizionari Bash su Linux e come li usi?

0
214
Un laptop stilizzato che mostra un terminale con righe di testo.
fatmawati achmad zaenuri/Shutterstock.com

I dizionari Bash forniscono mappe hash e array associativi negli script di shell di Linux. Ti mostreremo come utilizzare queste potenti e utili strutture di dati nei tuoi script di shell Linux.

Una rosa con qualsiasi altro nome

Che cos'è la shell Bash e perché è così importante per Linux?

IMPARENTATOChe cos’è la shell Bash e perché è così importante per Linux?

Il nome formale per i dizionari è array associativo. Sono anche chiamate tabelle 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 di dati contenuti in una struttura di dati. Per accedere a uno qualsiasi dei valori dei dati, noti come elementi dell’array, è necessario conoscere la loro posizione nell’array. La posizione di un elemento dell’array nell’array è nota come indice, quindi questi tipi di array sono noti come array indicizzati. Sono il tipo di array più comunemente usato.

Tuttavia, hanno uno svantaggio. Come si accede a un elemento dell’array se non si conosce la sua posizione all’interno dell’elenco? Devi scorrere tutti gli elementi nell’array, verificando se il valore in quella posizione è quello che stai cercando.

Gli array associativi superano questo problema. Non usano numeri interi per identificare in modo univoco gli elementi dell’array. Usano parole uniche note come parole chiave. Puoi recuperare il valore di un elemento dell’array usando 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. Cercare una parola e recuperare il suo valore associato imita la ricerca di una parola in un dizionario e trovarne il significato. Ecco perché gli array associativi sono noti come dizionari.

Bash 4.0 o superiore

Gli array associativi sono supportati nella shell Bash versione 4.0 o successiva. Se stai usando una distribuzione Linux attuale, dovresti stare bene. Per controllare la tua versione di Bash, usa questo comando:

bash --version

Annuncio

La macchina utilizzata per la ricerca di questo articolo ha installato Bash 5.1.4, quindi siamo a posto.

Principi di base

Per creare un array associativo sulla riga di comando del terminale o in uno script, utilizziamo il comando di dichiarazione Bash. Il -A (associativo) dice a Bash che questo sarà un array associativo e non un array indicizzato.

declare -A acronyms

Questo crea un array associativo chiamato “acronimi”.

Per inserire alcuni dati nel nostro array, dobbiamo fornire parole chiave e valori. Possiamo farlo usando questo formato:

array-name[key]=Value

Aggiungiamo alcuni elementi dell’array:

acronyms[ACK]=Acknowledgement
acronyms[BGP]="Border Gateway Protocol"
acronyms[CIDR]="Classless Inter-Domain Routing"
acronyms[DHCP]="Dynamic Host Configuration Protocol"
acronyms[EOF]="End of Frame"

Questi comandi definiscono cinque elementi dell’array. Si noti che i valori sono racchiusi tra virgolette se sono presenti spazi nel valore. Le nostre parole chiave sono state inserite in ordine alfabetico, ma possono essere inserite nell’ordine che preferisci. Le parole chiave devono essere univoche. Se provi a creare due voci con la stessa parola chiave, il secondo valore immesso sovrascriverà il primo. Avrai ancora solo una voce con quella parola chiave e sarà associata al secondo valore che hai aggiunto.

Per recuperare i valori dall’array, usiamo i comandi in questo formato:

${array-name[key]}
Annuncio

Possiamo usare echo per inviare l’output alla finestra del terminale:

echo ${acronyms[ACK]}
echo ${acronyms[DHCP]}

Utilizzo dei loop

Gli array si prestano molto bene ad essere utilizzati in loop. Gli array associativi non fanno eccezione. I cicli forniscono modi efficienti per richiamare una sequenza di azioni senza sezioni di codice ripetitive. Prima di esaminare i loop, c’è un modo efficiente per dichiarare gli array.

Creiamo gli array usando il declare comando (lo stesso -A opzione come prima), ma forniamo le parole chiave e i valori come un elenco sulla riga di comando.

declare -A countries=( [ALB]=Albania [BHR]=Bahrain [CMR]=Cameroon [DNK]=Denmark [EGY]=Egypt )

Il nome dell’array è “paesi” ed è collegato alla lista valori da un segno di uguale ” =.” La lista dei valori è racchiusa tra parentesi “()” e ogni parola chiave è racchiusa tra parentesi “[]“. Nota che non ci sono virgole che separano i valori. Se hai una stringa di valori che contiene spazi, dovrai racchiuderla tra virgolette.

Per fare in modo che un array associativo restituisca una parola chiave invece del valore, aggiungi un punto esclamativo “!” davanti al nome dell’array. Il simbolo “@” può essere utilizzato come carattere jolly, ovvero tutti gli elementi dell’array.

Questo for loop elencherà tutte le parole chiave:

for key in "${!countries[@]}"; do echo $key; done

Tieni presente che le parole chiave non sono necessariamente elencate nell’ordine in cui sono state create, ma non importa. Gli array associativi non si basano su un indice ordinato.

Annuncio

Possiamo anche utilizzare l’espansione dei parametri per elencare tutte le parole chiave. Verranno elencati su una riga, non uno per riga.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

Possiamo aumentare il nostro for loop per stampare le parole chiave e i valori contemporaneamente.

for key in "${!acronyms[@]}"; do echo "$key - ${acronyms[$key]}"; done

Se vogliamo sapere quanti elementi ci sono negli array, possiamo usare un cancelletto “#” davanti al nome dell’array invece di un punto esclamativo.

echo "${!countries[@]}"
echo "${!acronyms[@]}"

Verifica dell’esistenza di un elemento dell’array

Se cerchi una parola chiave ma non c’è un tale elemento dell’array, il valore restituito sarà una stringa vuota. A volte è utile avere un indicatore diverso per la presenza o l’assenza di un elemento dell’array.

Possiamo verificare la presenza di un elemento dell’array usando il “+_”operatore. Nota che questo viene dopo la parola chiave, non davanti al nome dell’array come gli operatori precedenti che abbiamo visto.

if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi
if [ ${acronyms[FTP]+_} ]; then echo "Found"; else echo "Not found"; fi

L’elemento dell’array con la parola chiave “EOF” si trova nell’array, ma l’elemento dell’array con la parola chiave “FTP” non lo è.

Aggiunta di elementi dell’array

L’aggiunta di nuovi elementi a un array associativo è facile. A differenza di alcuni linguaggi di programmazione, non è necessario definire la dimensione del proprio array quando lo si dichiara. Puoi continuare ad aggiungere nuovi elementi senza raggiungere un limite superiore predefinito.

Annuncio

Per aggiungere un nuovo elemento all’array, usiamo il “+=”operatore.

countries+=( [FJI]=Fiji )
echo "$(#countries[@]}"
echo ${countries[FJI]}

Il numero di elementi nell’array ora è sei e la ricerca della nuova parola chiave trova l’elemento dell’array e ne restituisce il valore.

Rimozione di elementi di array e array

Il unset comando viene utilizzato per rimuovere gli elementi dell’array. Se la parola chiave contiene spazi, racchiuderla tra virgolette.

unset acronyms[EOF]
if [ ${acronyms[EOF]+_} ]; then echo "Found"; else echo "Not found"; fi

Per rimuovere l’intero array, usa unset con il nome dell’array.

unset countries

Utilizzo di variabili con array

L’utilizzo di variabili con array associativi è semplice. In questo esempio, imposteremo una chiave variabile sulla stringa “EOF”. Useremo la variabile quando aggiungiamo un nuovo elemento dell’array all’array. In realtà, stiamo sostituendo l’elemento dell’array che abbiamo eliminato in precedenza.

Recupereremo il nuovo elemento dell’array chiamandolo con la nuova parola chiave e anche utilizzando la variabile. Se la parola chiave contiene spazi, dovrai racchiudere il nome della variabile tra virgolette.

key=EOF
acronyms[$key]="End of Frame"
echo ${acronyms[EOF]}
echo ${acronyms[$key]}

Diventa creativo

I nostri esempi sono state raccolte di informazioni in cui ogni elemento dell’array è indipendente da tutti gli altri, proprio come un dizionario. Ognuno è una definizione unica. Ma gli array associativi possono altrettanto facilmente contenere una varietà di informazioni tutte relative a una cosa, come le specifiche di diversi componenti hardware del computer:

declare -A specification
specification[CPU]="Dual Core AMD Ryzen 5 3600"
specification[Speed]="3600 MHz"
specification[Kernel]="5.11.0-17-generic x86_64"
specification[Mem]="1978.5 MiB"
specification[Storage]="32 GiB"
specification[Shell]="Bash"
echo ${specification[CPU]}

Scrivere in modo efficiente in una lingua significa conoscere i meccanismi e le strutture che offre e selezionare quella più appropriata per il problema che si sta cercando di risolvere. Gli array associativi ti offrono un modo facile da usare per archiviare i dati che puoi cercare per nome, proprio come un dizionario.