Bash: "printf% q $str" удаляет пробелы в скриптах. (Альтернативы?)

printf% q должен указывать строку. Однако при выполнении в script он удаляет пробелы.

Эта команда:

printf %q "hello world"

выходы:

hello\ world

что является правильным.

Этот script:

#!/bin/bash

str="hello world"
printf %q $str

выходы:

helloworld

что неверно.

Если такое поведение действительно ожидается, какая альтернатива существует в script для цитирования строки, содержащей любой символ, таким образом, что она может быть переведена обратно на оригинал вызываемой программой?

Спасибо.

Программное обеспечение: GNU bash, версия 4.1.5 (1) -release (i486-pc-linux-gnu)

EDITED: Решено, спасибо.

Ответ 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

Ответ 2

Попробуйте

printf %q "${str}"

в script.

Ответ 3

Это сработало для меня. Удовлетворяет этим требованиям

  • Принять произвольный ввод, который может включать специальные символы оболочки
  • Не выводит escape-символ, "\"
#! /bin/bash

FOO='myTest3$;  t%^&;frog now! and *()"'

FOO=`printf "%q" "$FOO"`                        # Has \ chars
echo $FOO

# Eat all the \ chars
FOO=$(printf "%q" "$FOO" | sed "s/\\\\//g")     # Strip \ chars

echo $FOO