Вы должны использовать:
printf %q "$str"
Пример:
susam@nifty:~$ cat a.sh
#!/bin/bash
str="hello world"
printf %q "$str"
susam@nifty:~$ ./a.sh
hello\ world
Когда вы запускаете printf %q $str
, оболочка расширяет его до:
printf %q hello world
Итак, строки hello
и world
поставляются как два отдельных аргумента команды printf
, и она выводит два аргумента рядом друг с другом.
Но когда вы запускаете printf %q "$str"
, оболочка расширяет его до:
printf %q "hello world"
В этом случае строка hello world
предоставляется в качестве одного аргумента для команды printf
. Это то, что вы хотите.
Вот что вы можете поэкспериментировать с этими понятиями:
susam@nifty:~$ showargs() { echo "COUNT: $#"; printf "ARG: %s\n" "$@"; }
susam@nifty:~$ showargs hello world
COUNT: 2
ARG: hello
ARG: world
susam@nifty:~$ showargs "hello world"
COUNT: 1
ARG: hello world
susam@nifty:~$ showargs "hello world" "bye world"
COUNT: 2
ARG: hello world
ARG: bye world
susam@nifty:~$ str="hello world"
susam@nifty:~$ showargs $str
COUNT: 2
ARG: hello
ARG: world
susam@nifty:~$ showargs "$str"
COUNT: 1
ARG: hello world