printf возвращает несколько копий - PullRequest
1 голос
/ 27 марта 2019

На OSX High Sierra, bash printf ведет себя неправильно.Рассмотрим:

printf "[%s]" "x"

возврат

[x]

все хорошо ... но:

printf "[%s]" "x" "y"

возврат

[x] [y]

вместо [x] !!

не говорите мне: не предоставляйте больше параметров,Я не знаю, как будет выглядеть формат при его передаче мне, но у меня есть параметры

, документы не обращаются к этому прямо, просто заявляя:

ФорматСтрока используется повторно так часто, как это необходимо для удовлетворения аргументов.Любые дополнительные спецификации формата оцениваются с нулем или пустой строкой.

это не работает?

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

Из утилиты posix printf :

  1. Операнд формата должен использоваться повторно так часто, как это необходимо для удовлетворения операндов аргумента.

Это точно означает, что строка формата повторяется столько раз, сколько необходимо для прохождения всех аргументов. Именно так оно и было задумано, и это одна из самых полезных функций printf.

Вы хотите повторить символ '#' 10 раз? Нет ничего проще:

printf "#%.0s" $(seq 10)
# will expand to:
printf "#%.0s" 1 2 3 4 5 6 7 8 9 10
# is equivalent to:
printf "#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s#%.0s" 1 2 3 4 5 6 7 8 9 10

%.0s будет печатать нулевой символ из строки, поэтому он будет печатать нулевой символ, поэтому он ничего не будет печатать. Таким образом, # повторяется столько раз, сколько аргументов.

У вас есть массив, и вы хотите напечатать все элементы массива, разделенные новой строкой? Нет ничего проще:

arr=(1 2 3 value1 test5 text7)
printf "%s\n" "${arr[@]}"
2 голосов
/ 27 марта 2019

Насколько я понимаю, ведет себя так, как указано в этом предложении документации:

Строка формата используется повторно так часто, как это необходимо для удовлетворения аргументов.

В вашемВ этом случае у вас есть 2 аргумента ("y" и "z") и просто 1 format string ([% s]), поэтому он используется повторно (т. е. используется одинаково для каждого аргумента).

Itвыполняет итерацию списка аргументов, и когда он достигает конца списка format string, он начинается с начала:

Команда:

printf "[%s](%s)" "x" "y" "z" "a" 

Ouputs:

[x](y)[z](a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...