$ a="hello world"
$ echo ${a// /_}
hello_world
Secondo bash(1):
${parameter/pattern/string}
Sostituzione del modello. Il pattern viene espanso per produrre un pattern proprio come nell'espansione del percorso. Il parametro viene espanso e la corrispondenza più lunga del modello rispetto al suo valore viene sostituita con la stringa. Se il modello inizia con /, vengono sostituite tutte le corrispondenze del modello
con spago. Normalmente viene sostituita solo la prima partita. Se il modello inizia con #, deve corrispondere all'inizio del valore espanso del parametro. Se il modello inizia con %, deve corrispondere alla fine del valore espanso del parametro. Se la stringa è nulla, le corrispondenze del modello vengono eliminate e il modello / seguente può essere omesso. Se il parametro è @ o *, l'operazione di sostituzione viene applicata a turno a ciascun parametro posizionale e l'espansione è l'elenco risultante. Se parametro è una variabile di matrice con indice @ o *, l'operazione di sostituzione viene applicata a turno a ciascun membro della matrice e l'espansione è l'elenco risultante.
Potresti provare quanto segue:
str="${str// /_}"