Что $ d делает в printf? - PullRequest
       84

Что $ d делает в printf?

0 голосов
/ 13 декабря 2018

Я случайно написал:

printf "here: %s $d\n" "${line:0:32}" "${#line}"

и получил:

here: /home/gsamaras/Bash/libs/goodLib 
here: 103 

Почему?

Конечно, я хотел сказать %d, но я неЯ не понимаю это поведение в своей ошибке.Я, вероятно, ожидал, что он напечатает "здесь: / home / gsamaras / Bash / libs / goodLib $ d", как это было бы в C ... Я не смог найтидубликат или что-то на это, таким образом, вопрос.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Первый шаг, оболочка выполняет расширение переменной.Поскольку переменная $d отсутствует, она заменяется пустой строкой.После замены переменной это выглядит так, как будто вы написали:

printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib 103

Теперь, почему она печатает here: дважды?Когда printf дается больше аргументов, чем спецификаторов формата, он повторяет строку формата, зацикливаясь на дополнительные моменты времени, пока не будут использованы все его аргументы.Поскольку у вас есть один %s, но два дополнительных аргумента, он повторяется дважды.Это как если бы вы написали:

printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib
printf 'here: %s \n' 103

Вот почему вы получаете две строки вывода.

0 голосов
/ 13 декабря 2018

Прежде чем строка "here: %s $d\n" будет передана в printf, расширения параметров выполняются оболочкой.В этом случае $d раскрывается в пустую строку.

Если вы использовали одинарные кавычки вокруг строки или экранировали обратную косую черту $, то вы увидите $d в выводе.

Поскольку у вас есть только один спецификатор формата в вашей строке (%s) и передано два аргумента после строки формата, вы получите две строки вывода:

Формат используется повторнопри необходимости использовать все аргументы.

(из man bash в разделе printf).

...