Введение
Обычно при написании сценариев bash мы используем echo
для вывода на стандартный вывод. echo
— простая команда, но ее возможности ограничены. Для большего контроля над форматированием вывода используйте команду printf
.
Команда printf
форматирует и печатает свои аргументы подобно функции C printf()
.
Команда печати
printf
— это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Также есть отдельный бинарный файл /usr/bin/printf
, но встроенная версия оболочки имеет приоритет. Мы рассмотрим встроенную версию printf
для Bash.
Синтаксис команды printf
следующий:
printf [-v var] format [arguments]
Опция -v
позволяет команде printf
не печатать вывод, а присваивать его переменной.
Параметр format
— это строка, которая может содержать объекты трех разных типов:
- Обычные символы, которые просто печатаются на выходе как есть.
- Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
- Спецификации преобразования, которые описывают формат и заменяются соответствующими значениями аргументов, которые следуют за строкой формата.
Команда принимает любое количество arguments
. Если указано несколько arguments
формата, строка format
повторно используется для всех arguments
. Если предоставлено меньше arguments
, чем format
, дополнительные числовые форматы устанавливаются равными нулю, а дополнительные строковые форматы устанавливаются в нулевую строку.
Вот некоторые моменты, которые следует учитывать при передаче аргументов команде 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» — arguments
. Строка формата содержит два символа новой строки ( \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 100
Decimal: 100
Hex: 64
Octal: 144
Директивы о флагах
Флаги являются необязательными первыми модификаторами и используются для установки выравнивания, ведущих нулей, префиксов и т. д.
Вот наиболее распространенные:
-
- По левому краю выравнивает печатный текст внутри поля. По умолчанию текст выравнивается по правому краю.+
- Префикс чисел со знаком+
или-
. По умолчанию отрицательный знак предшествует только отрицательным числам.0
- Цифровая клавиатура с ведущими нулями вместо пробела.- пустой
-
). #
- Альтернативный формат чисел.
Директива ширины
Директива width
помещается после любых флагов и указывает минимальное количество символов, которое должно привести к преобразованию.
Если ширина вывода текста меньше указанной ширины, он дополняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *
).
Вот пример:
printf "%20s %d\n" Mark 305
%20s
означает, что в поле должно быть не менее 20 символов. Перед текстом добавляются пробелы, потому что по умолчанию вывод выравнивается по правому краю. Чтобы выровнять текст по левому краю, используйте флаг -
( %-20s
).
Mark 305
Когда звездочка ( *
) используется в качестве директивы width
, ширина поля преобразования задается аргументом ширины, предшествующим форматированному аргументу.
В следующем примере мы устанавливаем ширину 10:
printf "%0*d" 10 5
0
— это флаг, который заполняет число ведущими нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:
0000000005
Директива о точности
Модификатор .precision
состоит из точки ( .
), за которой следует положительное целое число или звездочка ( *
), которые, в зависимости от типа спецификатора, устанавливают количество строковых или цифровых символов или количество десятичных цифр для печати.
.precision
имеет следующий эффект:
- Если тип преобразования — целое число,
precision
указывает минимальное количество цифр для печати. Если количество цифр в аргументе меньшеprecision
, печатаются ведущие нули. - Если тип преобразования — число с плавающей запятой,
precision
указывает количество цифр, следующих за символом десятичной точки. По умолчаниюprecision
равна 6. - Если тип преобразования — строка,
precision
указывает максимальное количество символов для печати. Если количество символов в аргументе превышаетprecision
, лишние символы обрезаются.
Вот пример, показывающий, как округлить число с плавающей запятой до 3 знаков после запятой:
printf "%.3f" 1.61803398
1.618
Когда для precision
задана звездочка ( *
), ее значение задается аргументом precision
, предшествующим форматируемому аргументу.
printf "%.*f" 3 1.61803398
1.618
Вывод
Команда printf
принимает формат и аргументы и печатает форматированный текст.