$ a="hello world"
$ echo ${a// /_}
hello_world
Podle bash(1):
${parameter/pattern/string}
Záměna vzoru. Vzor se rozšíří, aby vytvořil vzor stejně jako při rozšíření názvu cesty. Parametr se rozšíří a nejdelší shoda vzoru s jeho hodnotou je nahrazena řetězcem. Pokud vzor začíná /, budou nahrazeny všechny shody vzoru
s provázkem. Obvykle se nahrazuje pouze první zápas. Pokud vzor začíná znakem #, musí se shodovat na začátku rozšířené hodnoty parametru. Pokud vzor začíná %, musí se shodovat na konci rozšířené hodnoty parametru. Pokud je řetězec null, shody vzoru se odstraní a / následující vzor může být vynechán. Pokud je parametr @ nebo *, substituční operace se postupně použije na každý poziční parametr a rozšíření je výsledný seznam. Pokud je parametrem proměnná pole s indexem @ nebo *, substituční operace se postupně aplikuje na každý člen pole a rozšíření je výsledným seznamem.
Můžete zkusit následující:
str="${str// /_}"