Команда — printf

printf это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Существует также автономный двоичный файл /usr/bin/printf, но встроенная версия оболочки имеет преимущество. Мы рассмотрим встроенную версию Bash printf.

Синтаксис команды printf следующий:

Bash
printf [-v var] format [arguments]

Опция -v — указывает printf не печатать выход , но и присвоить его переменной.

format — строка, которая может содержать три различных типа объектов:

  • Обычные символы, которые просто выводятся на печать как есть.
  • Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
  • Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.

Команда принимает любое количество arguments. Если в arguments указано больше, чем спецификаторы формата, строка format используется повторно для использования всех аргументов. Если в arguments указано меньше спецификаторов формата, дополнительные спецификаторы числового формата устанавливаются в нулевое значение, а спецификаторы строкового формата — в нулевую строку.

Ниже приведены несколько моментов, которые следует учитывать при передаче аргументов команде printf:

  • Оболочка заменит все переменные, подстановочные знаки и специальные символы перед передачей аргументов в команду printf.
  • При использовании одинарных кавычек будет »сохранено буквальное значение каждого символа, заключенного в кавычки. Переменные и команды не будут расширены.

Типичный пример использования printf выглядит так:

Bash
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 в трех разных системах счисления:

Bash
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
Hex: 64
Octal: 144

Флаги директивы

Флаги являются первыми необязательными модификаторами и используются для установки выравнивания, начальных нулей, префиксов и т. д.

Вот самые распространенные из них:

  • — Выровнять напечатанный текст по полю слева. По умолчанию текст выравнивается по правому краю.
  • +- Префикс номера со знаком +или -. По умолчанию только отрицательные числа имеют префикс со знаком минус.
  • 0 — Числа дополняются нулями, а не пробелами.
  • blank — Префикс положительных чисел с пробелом и отрицательных чисел с минусом ( -).
  • #- Альтернативный формат для чисел.

ЧитатьНеобычные способы использования переменных внутри сценариев Bash

Директива ширины

Указанная директива width помещается после любых символов флага и определяет минимальное количество символов, которое должно привести к преобразованию.

Если ширина выводимого текста меньше указанной ширины, он дополняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *).

Вот пример:

Bash
printf "%20s %d\n" Mark 30

%20s означает установить поле длиной не менее 20 символов. Пробелы добавляются перед текстом, потому что по умолчанию вывод выровнен по правому краю. Чтобы выровнять текст по левому краю, используйте флаг (%-20s).

      Mark 305

Когда звездочка ( *) используется в качестве директивы width, тогда ширина поля преобразования устанавливается аргументом ширины, который предшествует форматируемому аргументу.

В приведенном ниже примере мы устанавливаем ширину 10:

Bash
printf "%0*d" 10 5

0 — это флаг, который дополняет число начальными нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:

0000000005

Директива точности

Модификатор .precision состоит из точки (.) с последующей положительным целым числом или звездочкой (*), которые в зависимости от типа спецификатора, задает число строк или цифровых символов или количество знаков после запятой для печати.

Точность имеет следующий эффект:

  • Если тип преобразования является целым числом, точность определяет минимальное количество цифр для печати. Если количество цифр в аргументе меньше точности, выводятся начальные нули.
  • Если тип преобразования является плавающей точкой, точность указывает количество цифр, следующих за символом десятичной запятой. Точность по умолчанию — 6.
  • Если тип преобразования является строкой, точность определяет максимальное количество символов для печати. Если количество символов в аргументе превышает точность, лишние символы усекаются.

Вот пример, показывающий, как округлить число с плавающей запятой до 3 десятичных знаков:

Bash
printf "%.3f" 1.61803398
1.618

Когда для точности задана звездочка ( *), ее значение задается аргументом точности, который предшествует форматируемому аргументу.

Bash
printf "%.*f" 3 1.61803398
1.618
Bash
dima@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
        cc
Bash
man printf
PRINTF(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)

Добавить комментарий