printf это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Существует также автономный двоичный файл /usr/bin/printf, но встроенная версия оболочки имеет преимущество. Мы рассмотрим встроенную версию Bash printf.
Синтаксис команды printf следующий:
printf [-v var] format [arguments]Опция -v — указывает printf не печатать выход , но и присвоить его переменной.
format — строка, которая может содержать три различных типа объектов:
- Обычные символы, которые просто выводятся на печать как есть.
- Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
- Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.
Команда принимает любое количество arguments. Если в arguments указано больше, чем спецификаторы формата, строка format используется повторно для использования всех аргументов. Если в arguments указано меньше спецификаторов формата, дополнительные спецификаторы числового формата устанавливаются в нулевое значение, а спецификаторы строкового формата — в нулевую строку.
Ниже приведены несколько моментов, которые следует учитывать при передаче аргументов команде printf:
- Оболочка заменит все переменные, подстановочные знаки и специальные символы перед передачей аргументов в команду printf.
- При использовании одинарных кавычек будет »сохранено буквальное значение каждого символа, заключенного в кавычки. Переменные и команды не будут расширены.
Типичный пример использования printf выглядит так:
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"Open issues: 34
Closed issues: 65Строка Open issues: %s\nClosed issues: %s\n — это 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: %d\nHex: %x\nOctal: %o\n" 100 100 100Decimal: 100
Hex: 64
Octal: 144Флаги директивы
Флаги являются первыми необязательными модификаторами и используются для установки выравнивания, начальных нулей, префиксов и т. д.
Вот самые распространенные из них:
- — Выровнять напечатанный текст по полю слева. По умолчанию текст выравнивается по правому краю.
- +- Префикс номера со знаком +или -. По умолчанию только отрицательные числа имеют префикс со знаком минус.
- 0 — Числа дополняются нулями, а не пробелами.
- blank — Префикс положительных чисел с пробелом и отрицательных чисел с минусом ( -).
- #- Альтернативный формат для чисел.
ЧитатьНеобычные способы использования переменных внутри сценариев Bash
Директива ширины
Указанная директива width помещается после любых символов флага и определяет минимальное количество символов, которое должно привести к преобразованию.
Если ширина выводимого текста меньше указанной ширины, он дополняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *).
Вот пример:
printf "%20s %d\n" Mark 30%20s означает установить поле длиной не менее 20 символов. Пробелы добавляются перед текстом, потому что по умолчанию вывод выровнен по правому краю. Чтобы выровнять текст по левому краю, используйте флаг (%-20s).
Mark 305Когда звездочка ( *) используется в качестве директивы width, тогда ширина поля преобразования устанавливается аргументом ширины, который предшествует форматируемому аргументу.
В приведенном ниже примере мы устанавливаем ширину 10:
printf "%0*d" 10 50 — это флаг, который дополняет число начальными нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:
0000000005Директива точности
Модификатор .precision состоит из точки (.) с последующей положительным целым числом или звездочкой (*), которые в зависимости от типа спецификатора, задает число строк или цифровых символов или количество знаков после запятой для печати.
Точность имеет следующий эффект:
- Если тип преобразования является целым числом, точность определяет минимальное количество цифр для печати. Если количество цифр в аргументе меньше точности, выводятся начальные нули.
- Если тип преобразования является плавающей точкой, точность указывает количество цифр, следующих за символом десятичной запятой. Точность по умолчанию — 6.
- Если тип преобразования является строкой, точность определяет максимальное количество символов для печати. Если количество символов в аргументе превышает точность, лишние символы усекаются.
Вот пример, показывающий, как округлить число с плавающей запятой до 3 десятичных знаков:
printf "%.3f" 1.618033981.618Когда для точности задана звездочка ( *), ее значение задается аргументом точности, который предшествует форматируемому аргументу.
printf "%.*f" 3 1.618033981.618dima@zabbix:~$ printf "\taa\tbb\tcc\n"
aa bb cc
dima@zabbix:~$ printf "\taa\n\tbb\tcc\n"
aa
bb cc
dima@zabbix:~$ printf "\taa\n\tbb\n\tcc\n"
aa
bb
ccman printfPRINTF(1) User Commands PRINTF(1)
NAME
printf - format and print data
SYNOPSIS
printf FORMAT [ARGUMENT]...
printf OPTION
DESCRIPTION
Print ARGUMENT(s) according to FORMAT, or execute according to OPTION:
--help display this help and exit
--version
output version information and exit
FORMAT controls the output as in C printf. Interpreted sequences are:
\" double quote
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)
\uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)
\UHHHHHHHH
Unicode character with hex value HHHHHHHH (8 digits)
%% a single %
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form \0 or
\0NNN
%q ARGUMENT is printed in a format that can be reused as shell input, escaping non-printable characters
with the proposed POSIX $'' syntax.
and all C format specifications ending with one of diouxXfeEgGcs, with ARGUMENTs converted to proper type
first. Variable widths are handled.
NOTE: your shell may have its own version of printf, which usually supersedes the version described here.
Please refer to your shell's documentation for details about the options it supports.
AUTHOR
Written by David MacKenzie.
REPORTING BUGS
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
COPYRIGHT
Copyright © 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
<https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent per‐
mitted by law.
SEE ALSO
printf(3)
Full documentation <https://www.gnu.org/software/coreutils/printf>
or available locally via: info '(coreutils) printf invocation'
GNU coreutils 8.32 February 2022 PRINTF(1)