$ a="hello world"
$ echo ${a// /_}
hello_world
Selon bash(1):
${parameter/pattern/string}
Substitution de motifs. Le modèle est développé pour produire un modèle comme dans l'expansion du nom de chemin. Le paramètre est développé et la correspondance la plus longue du motif par rapport à sa valeur est remplacée par une chaîne. Si le motif commence par /, toutes les correspondances du motif sont remplacées
avec ficelle. Normalement, seul le premier match est remplacé. Si le modèle commence par #, il doit correspondre au début de la valeur développée du paramètre. Si le motif commence par %, il doit correspondre à la fin de la valeur développée du paramètre. Si la chaîne est nulle, les correspondances de motif sont supprimées et le motif suivant peut être omis. Si le paramètre est @ ou *, l'opération de substitution est appliquée à chaque paramètre positionnel tour à tour, et le développement est la liste résultante. Si le paramètre est une variable de tableau indicée par @ ou *, l'opération de substitution est appliquée à chaque membre du tableau tour à tour, et le développement est la liste résultante.
Vous pouvez essayer ce qui suit :
str="${str// /_}"