Manipolare le variabili stringa con Bash

Manipolare le variabili stringa con Bash

La shell Bash è estremamente versatile e potente, lo dimostra la facilità con cui è possibile, con essa, manipolare le variabili di tipo stringa.

Supponiamo di aver definito una variabile di tipo stringa col nome str, grazie all'operatore ${} possiamo facilmeente estrarre dalla variabile delle sottostringhe arbitrarie della stringa data.

L'operatore funziona così:

${*variabile*:*start*:*stop*}

dove:

  • variabile: è il nome della varibile stringa da cui vogliamo estrarre una sottostringa
  • start: è l'indice di partenza della sottostringa che può essere un numero positivo, nel qual caso l'estrazione parte da sinistra (e il primo carattere è ad indice 0) oppure negativo specificato tra parentesi tonde e in quel caso il conteggio parte dal lato destro (la fine) della stringa.
  • stop: indica il punto di stop indicato in numero di caratteri (se positivo) o in distanza dalla fine della stringa se negativo.

Per chiarire, vediamo qualche esempio:


$ str="Viva la shell" # Definizione della nostra variabile stringa
$ echo ${str}   # Stringa iniziale intera
Viva la shell
$ echo ${str:0:2}    # "Vi" (slicing da sinistra)
Vi
$ echo ${str::2}     # "Vi" (slicing da sinistra - lo 0 si può omettere)
Vi
$ echo ${str::-1}    # "Viva la shel" (slicing)
Viva la shel
$ echo ${str:6:-1}    # "a shel" (slicing)
a shel
$ echo ${str:(-3)}   # "ell" (slicing from right)
ell
$ echo ${str:(-5):2} # "sh" (slicing from right)
sh

Notate dagli esempi che se vogliamo usare un numero negativo come parametro di start dobbiamo necessariamente metterlo tra parentesi tonde.

Bonus tip

Esiste anche una sintassi per eseguire la sostituzione di parti di stringa tramite una regular expression:


$ str="Viva la shell" # Definizione della nostra variabile stringa
$ echo ${str/shell/SHELL}
Viva la SHELL

In questo esempo abbiamo sostituito "shell" con "SHELL".

Andrea
Variabili con parentesi tonde
Written by Andrea on 10 Agosto 2022

Ciao, in vari script shell incontro variabili con parentesi tonde, tipo:

!/bin/sh -u

\

if { ![info exists env(IAFSTATSDISABLE)] } {

ma se prova a fare nella shell, ottengo:

echo $env(IAFSTATSDISABLE) Badly placed ()'s.

Come mai? Grazie mille