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
- il video su YouTube
- esempi e comandi della puntata su GitHub
- Manuale di Bash (man page) — in italiano
- Parameter expansion, BashGuide — parametri e variabili
- ParameterExpansion, Wooledge wiki — tutte le forme di ${…} con esempi
- Bash, Arch Wiki — trucchi e configurazione
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!
