Обычно при написании сценариев bash мы используем echo
для вывода на стандартный вывод. echo
— простая команда, но ее возможности ограничены.
Чтобы иметь больше контроля над форматированием вывода, используйте команду printf
.
Команда printf
форматирует и печатает свои аргументы, аналогично printf()
в Си.
Содержание
Команда printf
printf
— это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Также существует отдельный двоичный файл /usr/bin/printf
, но встроенная версия оболочки имеет приоритет. Мы рассмотрим встроенную в Bash версию printf
.
Синтаксис команды printf
следующий:
printf [-v var] format [arguments]
Параметр -v
указывает printf
не печатать вывод, а назначать его переменной.
format
представляет собой строку, которая может содержать три разных типа объектов:
- Обычные символы, которые просто выводятся как есть.
- Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
- Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.
Команда принимает любое количество arguments
. Если указано больше arguments
чем спецификаторов format
строка format
повторно используется для использования всех аргументов. Если передано меньше arguments
чем указателей формата, дополнительные описатели числового формата устанавливаются на нулевое значение, а описатели строкового формата устанавливаются на пустую строку.
Ниже приведены несколько моментов, которые следует учитывать при передаче аргументов команде printf
:
- Оболочка заменит все переменные, сопоставление подстановочных знаков и специальные символы перед передачей аргументов команде
printf
. - При использовании одинарных кавычек
''
буквальное значение каждого символа, заключенного в кавычки, будет сохранено. Переменные и команды расширяться не будут.
Типичный пример использования printf
выглядит так:
printf "Open issues: %snClosed issues: %sn" "34" "65"
Open issues: 34
Closed issues: 65
Строка Open issues: %snClosed issues: %sn
— это format
а «34» и «65» — аргументы. Строка формата содержит два символа новой строки ( n
) и два спецификатора формата ( %s
), которые заменяются аргументами.
Команда printf
не добавляет символ новой строки ( n
) в конец строки.
Символы с экранированием обратной косой чертой
Экранированные символы обратной косой черты интерпретируются при использовании в строке формата или в аргументе, соответствующем спецификатору преобразования %b
. Вот список наиболее распространенных escape-символов:
\
— отображает обратную косую черту.b
— отображает символ возврата.n
— отображает новую строку.r
— отображает возврат каретки.t
— отображает горизонтальную вкладку.v
— отображает вертикальную вкладку.
Технические характеристики преобразования
Спецификация преобразования имеет следующую форму:
%[flags][width][.precision]specifier
Каждая спецификация преобразования помечается знаком процента ( %
), включает необязательные модификаторы и заканчивается одной из следующих букв, представляющих тип данных ( specifier
) соответствующего аргумента: aAbcdeEfgGioqsuxX
.
Спецификатор преобразования типа
Преобразование типа specifier
это символ , который указывает , как интерпретировать соответствующий аргумент. Этот символ является обязательным и помещается после необязательных полей.
Ниже приведен список, в котором показаны все преобразования типов и их назначение:
%b
— распечатать аргумент при расширении escape-последовательностей с обратной косой чертой.%q
— распечатать аргумент, заключенный в кавычки, повторно используемый в качестве входных данных.%d
,%i
— вывести аргумент как десятичное целое число со знаком.%u
— распечатать аргумент как десятичное целое число без знака.%o
— вывести аргумент в виде восьмеричного целого числа без знака.%x
,%X
— распечатать аргумент как шестнадцатеричное целое число без знака.%x
печатает строчные буквы, а%X
печатает прописные.%e
,%E
— распечатать аргумент как число с плавающей запятой в экспоненциальной записи.%e
печатает буквы в нижнем регистре, а%E
верхнем регистре.%a
,%A
— распечатать аргумент как число с плавающей запятой в шестнадцатеричной дробной нотации.%a
печатает буквы в нижнем регистре, а%A
верхнем регистре.%g
,%G
— Распечатать аргумент как число с плавающей запятой в нормальном или экспоненциальном представлении, в зависимости от того, что больше подходит для данного значения и точности.%g
печатает буквы нижнего регистра, а%G
печатает прописные.%c
— распечатать аргумент как один символ.%f
— распечатать аргумент как число с плавающей запятой.%s
— распечатать аргумент в виде строки.%%
— вывести буквальный символ%
.
Число без знака представляет ноль и положительные числа, а число со знаком представляет отрицательные, нулевые и положительные числа.
Следующая команда выводит число 100 в трех разных системах счисления:
printf "Decimal: %dnHex: %xnOctal: %on" 100 100 100
Decimal: 100
Hex: 64
Octal: 144
Директива флагов
Флаги являются первыми необязательными модификаторами и используются для установки выравнивания, ведущих нулей, префиксов и т. Д.
Вот самые распространенные:
-
— Выровнять напечатанный текст в поле по левому краю. По умолчанию текст выравнивается по правому краю.+
— Перед числами ставьте знаки+
или-
. По умолчанию только отрицательные числа имеют префикс со знаком минус.0
— дополняет числа начальными нулями, а не пробелом.- пустой
— Перед положительными числами ставьте пробел, а отрицательные числа — минусом (
-
). #
— Альтернативный формат чисел.
Директива по ширине
Поле директивы width
помещается после любых символов флага и определяет минимальное количество символов, к которому должно привести преобразование.
Если ширина выводимого текста меньше указанной ширины, он заполняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *
).
Вот пример:
printf "%20s %dn" Mark 305
%20s
означает, что длина поля должна быть не менее 20 символов. Перед текстом добавляются пробелы, поскольку по умолчанию вывод выравнивается по правому краю. Чтобы выровнять текст по левому %-20s
, используйте флаг -
( %-20s
).
Mark 305
Когда звездочка ( *
) используется в качестве директивы width
, тогда ширина поля преобразования устанавливается аргументом ширины, который предшествует аргументу, который форматируется.
В приведенном ниже примере мы устанавливаем ширину 10:
printf "%0*d" 10 5
0
— это флаг, который дополняет число ведущими нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:
0000000005
Директива о точности
Модификатор .precision
состоит из точки ( .
), За которой следует положительное целое число или звездочка ( *
), которая в зависимости от типа спецификатора устанавливает количество строковых или цифровых символов или количество десятичных знаков, которые должны быть напечатаны.
Точность имеет следующий эффект:
- Если тип преобразования — целое число, точность определяет минимальное количество цифр, которые нужно напечатать. Если количество цифр в аргументе меньше точности, печатаются ведущие нули.
- Если тип преобразования — с плавающей запятой, точность определяет количество цифр, следующих за десятичным знаком. По умолчанию точность равна 6.
- Если тип преобразования — строка, точность определяет максимальное количество символов, которые нужно напечатать. Если количество символов в аргументе превышает точность, лишние символы усекаются.
Вот пример, показывающий, как округлить число с плавающей запятой до трех знаков после запятой:
printf "%.3f" 1.61803398
1.618
Если для точности задана звездочка ( *
), ее значение устанавливается аргументом точности, который предшествует аргументу, который форматируется.
printf "%.*f" 3 1.61803398
1.618
Выводы
Команда printf
принимает формат и аргументы и печатает отформатированный текст.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.