printf ведет себя неожиданно - PullRequest
1 голос
/ 21 июня 2019

У меня неожиданные результаты при подсказке bash.

Вот некоторые данные:

echo "version = blahblah" > xxx

И я хочу сделать это:

printf "%s (%s)\n" `grep '^version =' xxx` "something"

Который я ожидал:

version = blahblah (something)

Вместо этого я получаю:

version (=)
blahblah (something)

Может кто-нибудь уточнить, почему я это получаю?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Используйте $(...) для подстановки команд, и вы должны заключить его в кавычки:

printf "%s (%s)\n" "$(grep '^version =' xxx)" "something"

Без кавычек printf рассматривает разделенный пробелом вывод команды grep как различные параметры для printf.

BASH: часто задаваемые вопросы: почему $(...) предпочтительнее обратных кавычек?

2 голосов
/ 21 июня 2019

Поскольку спецификаторы формата не совпадают с тем, который вы определили, и количеством аргументов, которые видит printf.При

printf "%s (%s)\n" 
#      ^^^  ^^^    

, указанном выше, команда исключает две последовательности строк, за которыми следует символ новой строки.Но ваши аргументы printf() больше, чем

version = blahblah something
# (1)  (2)   (3)    (4)

Так что printf() видит это несоответствие между спецификаторами и аргументами и вставляет символ новой строки после 2-го аргумента, который является =

printf '%s (%s)\n' 'version' '=' 'blahblah' 'something'

Поскольку вы ожидаете напечатать version = в одну строку, выведите весь вывод grep в одну строку, как в ответе анубхавы таким образом, что printf увидит аргументы, приведенные ниже

printf '%s (%s)\n' 'version = blahblah' 'something'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...