Как распечатать вывод в Bash с помощью команды Printf в Linux

12 set 2022 4 min di lettura
Как распечатать вывод в Bash с помощью команды Printf в Linux
Indice dei contenuti

Введение

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

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.