Команда printf в Bash

Обычно при написании сценариев 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 принимает формат и аргументы и печатает отформатированный текст.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий