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