Bash: «printf% q $ str» удаляет пробелы в скриптах.(Альтернативы?) - PullRequest
11 голосов
/ 28 января 2012

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

Эта команда:

printf %q "hello world"

выходы:

hello\ world

что правильно.

Этот скрипт:

#!/bin/bash

str="hello world"
printf %q $str

выходы:

helloworld

что не так.

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

Спасибо.

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

Отредактировано: решено, спасибо.

Ответы [ 3 ]

37 голосов
/ 28 января 2012

Вы должны использовать:

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
1 голос
/ 28 января 2012

Попробуйте

printf %q "${str}"

в вашем скрипте.

0 голосов
/ 06 мая 2014

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

  1. Принимать произвольный ввод, который может включать специальные символы оболочки
  2. Не выводит 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...