GNU/Linux: l’espansione dei parametri in bash

Quando scriviamo $variabile in Bash, la shell sostituisce quel nome con il valore: si chiama espansione di parametro. La forma con le graffe, ${variabile}, però non serve solo a delimitare il nome: dentro le graffe si nascondono decine di piccoli trucchi per dare valori di default, tagliare stringhe, sostituire pezzi di testo e cambiare maiuscole e minuscole, senza chiamare sed o awk. In questo articolo li vediamo tutti, uno per uno, con l’output che ottenete davvero.

L’espansione base

Le due forme sono equivalenti:

v=123
echo $v
echo ${v}

L’output è lo stesso, due volte:

123
123

Le graffe servono quando il nome della variabile è attaccato ad altro testo: ${v}abc è il valore di v seguito da abc, mentre $vabc chiederebbe la variabile vabc.

Valori di default

Con ${variabile-default} otteniamo il valore della variabile se esiste, altrimenti il default. La variabile non viene modificata.

echo ${v-undefined}
echo ${x-undefined}

Con v già impostata a 123 e x mai definita, l’output è:

123
undefined

Se invece vogliamo anche assegnare il valore di default, si usa :=. I due punti iniziali sono un comando che non fa niente, serve solo a far eseguire l’espansione senza provare a lanciare il risultato come programma.

: ${v:=prova}
echo $v
: ${x:=prova}
echo $x

La variabile v esisteva già e resta 123, mentre x viene creata:

123
prova

Errore se il parametro non esiste

Con ${variabile:?messaggio} lo script si ferma con un errore se la variabile non è impostata, e stampa il messaggio. È comodo per controllare i parametri obbligatori.

: ${z:?errore}
: ${x:?errore}

Con z mai definita e x già impostata, la prima riga stampa un errore simile a questo, la seconda passa senza dire niente:

bash: z: errore

Messaggio se il parametro esiste

Il contrario di quello che abbiamo visto: ${variabile:+valore} dà il valore indicato solo se la variabile esiste ed è non vuota, altrimenti niente.

echo ${x:+OK}
echo ${n:+OK}

Con x impostata ed n no, l’output è un OK e una riga vuota:

OK

Sottostringhe

La forma ${variabile:inizio:lunghezza} estrae un pezzo della stringa. Si parte a contare da zero. Usiamo una stringa facile da leggere:

s=01234567890abcdefgh
echo ${s:7}
echo ${s:7:3}
echo ${s:7:-5}

Il primo prende tutto dalla posizione 7 in poi, il secondo prende tre caratteri, il terzo prende dalla posizione 7 escludendo gli ultimi cinque caratteri. L’output è:

7890abcdefgh
789
7890abc

Con un numero negativo si parte dalla fine. Attenzione allo spazio dopo i due punti: senza, Bash lo confonde con la forma :- del valore di default.

echo ${s: -5}
echo ${s: -5:2}
echo ${s: -5:-2}

L’output è:

defgh
de
def

Nomi di variabili E lunghezza

Con ${!prefisso@} otteniamo i nomi di tutte le variabili che cominciano con quel prefisso. Con ${#variabile} la lunghezza del valore.

var1=A1
var2=A2
echo ${!var@}
echo ${#var1}

L’output è:

var1 var2
2

Rimuovere un pezzo da sinistra

Con # togliamo il prefisso più corto che corrisponde al modello, con ## il più lungo. Il modello può contenere l’asterisco.

es=123abc456def123ghi
echo ${es#12}
echo ${es#*12}
echo ${es##*12}

Il primo toglie solo “12”, gli altri due cercano un qualunque testo seguito da “12”: con un cancelletto si ferma alla prima occorrenza, con due arriva fino all’ultima. L’output è:

3abc456def123ghi
3abc456def123ghi
3ghi

Si usa spesso per togliere un percorso o un’estensione dai nomi di file.

Rimuovere un pezzo da destra

Lo stesso, ma dalla fine della stringa: % toglie il suffisso più corto, %% il più lungo.

es=xyz123abc456def123ghi
echo ${es%ghi}
echo ${es%123*}
echo ${es%%123*}

L’output è:

xyz123abc456def123
xyz123abc456def
xyz

Sostituire sottostringhe

Con una barra sostituiamo la prima occorrenza, con due barre tutte le occorrenze. Con /# la sostituzione avviene solo se il modello è all’inizio, con /% solo se è alla fine.

es=xyz123abc456def123ghi
echo ${es/123/XXX}
echo ${es//123/XXX}
echo ${es/#xyz/XXX}
echo ${es/%ghi/XXX}

L’output è:

xyzXXXabc456def123ghi
xyzXXXabc456defXXXghi
XXX123abc456def123ghi
xyz123abc456def123XXX

Maiuscole E minuscole

Dalla versione 4 di Bash possiamo cambiare la capitalizzazione. Il cappuccio ^ rende maiuscolo, la virgola , rende minuscolo. Un simbolo solo agisce sul primo carattere, due su tutta la stringa. Se aggiungiamo una lettera, agisce solo sui caratteri uguali a quella.

es=abc123abc456def123ghi
echo ${es^}
echo ${es^^}
echo ${es^a}
echo ${es^^b}

L’output è:

Abc123abc456def123ghi
ABC123ABC456DEF123GHI
Abc123abc456def123ghi
aBc123aBc456def123ghi

E al contrario, con la virgola, partendo da una stringa maiuscola:

es=ABC123ABCabc456defDEF
echo ${es,}
echo ${es,,}
echo ${es,A}
echo ${es,,B}

L’output è:

aBC123ABCabc456defDEF
abc123abcabc456defdef
aBC123ABCabc456defDEF
AbC123AbCabc456defDEF

Chiusura

Sono tanti simboli, ma la logica è sempre la stessa: dentro le graffe mettiamo il nome della variabile e poi un operatore che dice cosa farne. Ve ne basteranno due o tre per i vostri script di tutti i giorni; per gli altri c’è questo articolo.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
ma se vuoi offrirmi un caffè, mi aiuterà a rimanere sveglio mentre registro i video 😁☕
clicca qui per scoprire come https://buymeacoffee.com/thelinuxnerd

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!