#howto - Bash: operazioni sulle stringhe
Nell’articolo precedente, focalizzato nello specifico su Bash, è stato descritto cosa sono le stringhe, come crearle, come salvarle in una variabile; il tutto è stato corredato di esempi e consigli per evitare di ritrovarsi dinanzi a comportamenti inaspettati da parte delle shell.
In quest’articolo, riguardante le principali operazioni sulle stringhe, è stavolta incentrato sia su Bash che Zsh, due delle shell più comunemente utilizzate. Il comportamento delle due shell è solitamente uguale nelle medesime condizioni, altre volte però diverge.
Tipi di variabili
Le variabili si classificano principalmente in tre gruppi:
- definite e non vuote;
- definite ma vuote;
- indefinite (o inesistenti).
variabile="Hello World" # variabile definita, non vuota
vuoto="" # variabile definita ma vuota
Sostituzione
Applica la sostituzione semplice con il suo contenuto.
${variabile}
Sostituzione condizionata inesistenza
Applica la sostituzione con “val” solamente se la variabile non esiste.
${variabile-val}
Sostituzione condizionata vuota o inesistente
Comporta la sostituzione con “val” sia che la variabile non esista, sia che esista ma sia vuota.
${variabile:-val}
Sostituzione condizionata esistente
Comporta la sostituzione con “val” solamente se la variabile esiste (a prescindere che sia vuota o meno).
${variabile+val}
Sostituzione condizionata vuota
Comporta la sostituzione con “val” solamente se la variabile esiste e non è vuota.
${variabile:+val}
Sostituzione con valore di default
Imposta il valore della variabile a “default” solamente se la variabile non esisteva in precedenza.
${variabile=default}
Sostituzione con valore di default Condizionata
Imposta il valore della variabile a “default” solamente se la variabile non esisteva o era vuota in precedenza.
${variabile:=default}
Sostituzione su zsh con valore di default
Su Bash, si tratta di un’operazione non valida. Su Zsh, la variabile viene impostata sempre a “default”, a prescindere che esista o meno.
${variabile::=default}
Sostituzione con errore per variabile vuota
Si comporta come ${variabile}
se essa è definita e non è vuota, altrimenti stampa (in stderr) il messaggio “msg” e imposta il returncode ($?) a 1 (se avviene in uno script, ne comporta la terminazione).
${variabile?msg}
Sostituzione con errore se non definita
Si comporta come ${variabile}
se è definita, a prescindere che sia vuota o meno, altrimenti stampa (in stderr) il messaggio “msg” e imposta il returncode ($?) a 1 (se avviene in uno script, ne comporta la terminazione).
${variabile:?msg}
Sostituzione corta rimuovendo il prefisso
Se possibile, ritorna ${variabile}
senza la parte iniziale “prefisso”, altrimenti ritorna ${variabile}
rimanendola invariata. Si possono utilizzare anche i caratteri glob di bash come *
per indicare una qualunque sequenza di caratteri.
Se non si è pratici, si può consultare l’articolo velocizzarsi nel terminale parte 2.
La rimozione avviene in modo che il pattern “prefisso” tolga quanti meno caratteri possibili.
${variabile#prefisso}
Sostituzione lunga rimuovendo il prefisso
${variabile##prefisso}
Se possibile, ritorna ${variabile}
senza la parte iniziale “prefisso”, altrimenti ritorna ${variabile}
rimanendola invariata. Si possono utilizzare anche i caratteri glob di bash come *
per indicare una qualunque sequenza di caratteri.
Se non si è pratici, si può consultare l’articolo velocizzarsi nel terminale parte 2.
La rimozione avviene in modo che il pattern “prefisso” tolga quanti più caratteri possibili.
Sostituzione corta e sostituzione lunga del prefisso
Per comprendere meglio la differenza tra questa versione e quella corta si può notare la differenza di questo esempio:
variabile="file_file_ciao"
echo ${variabile#fi*_}
# l'output sarà "file_ciao"
echo ${variabile##fi*_}
# l'output sarà "ciao"
Sostituzione corta rimuovendo il suffisso
Se possibile, ritorna ${variabile}
senza la parte finale “suffisso”, altrimenti ritorna ${variabile}
rimanendola invariata. Si possono utilizzare anche i caratteri glob di bash come *
per indicare una qualunque sequenza di caratteri.
Se non si è pratici, si può consultare l’articolo velocizzarsi nel terminale parte 2.
La rimozione avviene in modo che il pattern “suffisso” tolga quanti meno caratteri possibili.
${variabile%suffisso}
Sostituzione lunga rimuovendo il suffisso
${variabile%%suffisso}
Se possibile, ritorna ${variabile}
senza la parte finale “suffisso”, altrimenti ritorna ${variabile}
rimanendola invariata. Si possono utilizzare anche i caratteri glob di bash come *
per indicare una qualunque sequenza di caratteri.
Se non si è pratici, si può consultare l’articolo velocizzarsi nel terminale parte 2.
La rimozione avviene in modo che il pattern “suffisso” tolga quanti più caratteri possibili.
Sostituzione corta e sostituzione lunga del suffisso
Per comprendere meglio la differenza tra questa versione e quella corta si può notare la differenza di questo esempio:
variabile="ciao.php.txt"
echo ${variabile%.*}
# l'output sarà "ciao.php"
echo ${variabile%%.*}
# l'output sarà "ciao"
Sostituzione inversa
Su Bash, si tratta di un’operazione non valida.
Su Zsh, ritorna una stringa vuota (“”) se ${variabile}
corrisponde esattamente a “val”, altrimenti si comporta come ${variabile}
.
${variabile:#val}
Sostituzione con sottostringa: offset iniziale
Ritorna una parte di ${variabile}
, dalla posizione “offset” in poi (l’offset deve essere necessariamente positivo).
${variabile:offset}
Sostituzione con sottostringa: offset finale
Ritorna una parte di ${variabile}
, dalla posizione “offset” fino alla fine (l’offset deve essere necessariamente negativo).
${variabile: -offset}
Nota:
tra i due punti (
:
) e il segno meno (-
) deve esserci sempre almeno uno spazio affinché la shell non interpreti il formato come${variabile:-val}
(il quale viene considerato un caso diverso, già trattato in precedenza).
Sostituzione con sotto-stringa
Ritorna una parte di ${variabile}
, a partire dalla posizione “offset” fino ai successivi “lunghezza” caratteri.
Il comportamento di questa sostituzione varia in base al segno sia dell’offset che della lunghezza, i quali possono essere entrambi valori negativi.
${variabile:offset:lunghezza}
Sostituzione con rimpiazzamento
Sostituisce la parte di stringa catturata da “pattern” con “sostituzione” (al massimo la prima occorrenza).
${variabile/pattern/sostituzione}
Sostituzione con rimpiazzamento globale
Sostituisce la parte di stringa catturata da “pattern” con “sostituzione” (quante più occorrenze possibili).
${variabile//pattern/sostituzione}
Lunghezza della variabile
Restituisce la lunghezza della stringa memorizzata in ${variabile}
.
${#variabile}
Tabella riepilogativa
Operazione | Parametri | output con variabile=”Hello World” | output con variabile=”” (variabile vuota) | output con “$variabile” non definita |
---|---|---|---|---|
${variabile-val} |
“Hello World” | ”” | “val” | |
${variabile:-val} |
“Hello World” | “val” | “val” | |
${variabile+val} |
“val” | “val” | ”” | |
${variabile:+val} |
“val” | ”” | ”” | |
${variabile=default} |
“Hello World” | ”” | variabile=”default” | |
${variabile:=default} |
“Hello World” | variabile=”default” | variabile=”default” | |
${variabile::=default} |
variabile=”default” (solo Zsh) | variabile=”default” (solo Zsh) | variabile=”default” (solo Zsh) | |
${variabile?msg} |
“Hello World” | ”” | Return code $?=1, scrive in stderr “msg” | |
${variabile:?msg} |
“Hello World” | Return code $?=1, scrive in stderr “msg” | Return code $?=1, scrive in stderr “msg” | |
${variabile#prefisso} |
prefisso = *o | ” World” | ”” | ”” |
${variabile##prefisso} |
prefisso = *o | “rld” | ”” | ”” |
${variabile%suffisso} |
suffisso = o* | “Hello W” | ”” | ”” |
${variabile%%suffisso} |
suffisso = o* | “Hell” | ”” | ”” |
${variabile:#val} |
val = Hello | “Hello World” | ”” | ”” |
${variabile:offset} |
offset = 9 | “ld” | ”” | ”” |
${variabile: -offset} |
offset = 9 | “Hello Wor” | ”” | ”” |
${variabile:offset:length} |
offset = 1, length = -6 | “ello” | ”” | ”” |
${variabile/pattern/sostituzione} |
pattern = l | “He-lo World” | ”” | ”” |
${variabile//pattern/sostituzione} |
pattern = l | “He–o Wor-d” | ”” | ”” |
${#variabile} |
11 | 0 | 0 |