printf "> %s < " 1 2 3
будет печатать
> 1 <> 2 <> 3 <
printf "> %s %s <" 1 2 3
печатает
> 1 2 <> 3 <
printf
съедает все аргументы, чтобы удовлетворить свою строку формата а затем повторяется, пока не будут обработаны все аргументы.Второй скрипт работает, потому что только
$ a
когда-либо назначается, и поэтому команда не переполняется на дополнительные итерации (есть только одна итерация).Такое поведение задокументировано в тексте, предоставленном с помощью
help printf
:... Формат повторно используется по мере необходимости для использования всех аргументов . Если меньше аргументов, чем требует формат, дополнительные спецификации формата ведут себя так, как если бы было предоставлено нулевое значение или пустая строка, в зависимости от ситуации, . ...
и санкционировано http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html