Команда printf в Bash с примерами

В сценариях Bash команда printf - это надежная утилита, обеспечивающая широкий контроль над форматированием вывода. Возникнув из функции printf() языка программирования C, printf в Bash является встроенной командой, имеющей приоритет над отдельным бинарным файлом /usr/bin/printf.

Команда printf

Команда printf отличается от команды echo, другого распространенного инструмента вывода в сценариях Bash. В то время как echo обеспечивает простоту, printf выигрывает, когда требуется точный контроль над форматом вывода. Она позволяет задавать ширину поля вывода, заполнять его ведущими нулями, выравнивать вывод, а также использовать другие возможности.

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

Универсальность printf проявляется в широком спектре ее применения. Она может печатать простой текст, форматировать и печатать переменные, создавать таблицы данных и даже генерировать динамический вывод, например, индикаторы выполнения. Однако, в отличие от echo, printf не добавляет автоматически символ новой строки (\n) в конце вывода, что требует ручного включения в строку форматирования, когда это необходимо.

По сути, printf - это мощный инструмент в написании сценариев Bash. Будь вы новичком в написании сценариев Bash или опытным разработчиком, освоение команды printf может значительно улучшить ваши навыки написания сценариев. По мере продвижения к основной статье мы будем более глубоко изучать команду printf, приводя как базовые, так и продвинутые примеры для всестороннего понимания.

Понимание команды printf в Bash

Синтаксис команды printf

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

Опция -v указывает printf не печатать вывод, а присвоить его переменной. Формат - это строка, которая может содержать три различных типа объектов:

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

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

Соображения при передаче аргументов команде printf

При передаче аргументов команде printf необходимо учитывать несколько моментов:

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

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

В результате будет выведено:

В этом примере строка Открытые вопросы: %s\nЗакрытые вопросы: %s\n является форматом, а "34" и "65" - аргументами. Строка формата содержит два символа новой строки (\n) и два спецификатора формата (%s), которые заменяются аргументами.

Важно отметить, что команда printf не добавляет символ новой строки (\n) в конец строки. Это ключевое отличие от команды echo, которая по умолчанию добавляет символ новой строки.

Символы обратного слеша

Символы с обратным слешем интерпретируются при использовании в строке формата или в аргументе, соответствующем спецификатору преобразования %b. Ниже приведен список наиболее распространенных символов экранирования:

  • \\\ - Отображает символ обратной косой черты.
  • \b - Отображает символ обратного слэша.
  • \n - Отображает новую строку.
  • \r - отображает возврат каретки.
  • \t - Отображает горизонтальную табуляцию.
  • \v - Отображает вертикальную табуляцию.

Спецификации преобразования

Спецификация преобразования имеет следующий вид:

Каждая спецификация преобразования начинается со знака процента (%), включает необязательные модификаторы и заканчивается одной из следующих букв, которые представляют тип данных (спецификатор) соответствующего аргумента: aAbcdeEfgGioqsuxX.

Понимание спецификаторов преобразования

Спецификатор преобразования типа - это символ, который указывает, как интерпретировать соответствующий аргумент. Этот символ является обязательным и располагается после необязательных полей. Ниже приведен список, показывающий все преобразования типов и то, что они делают:

  • %b - Вывести аргумент, расширяя экранирующие последовательности обратной косой черты.
  • %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 в трех различных системах счисления:

Это приведет к выводу:

Директива флагов

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

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

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

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

Вот пример:

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

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

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

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

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

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

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

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

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

В результате будет выведено:

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

Это также выведет:

Основные примеры использования команды Bash printf

Теперь, когда мы рассмотрели основы команды printf, давайте рассмотрим несколько примеров ее использования. Эти примеры помогут вам понять, как эффективно использовать команду printf в ваших сценариях bash.

Пример 1: Печать простого текста

Вы можете использовать printf для печати простого текста. Например:

Это приведет к выводу:

В этом примере Hello, World!\n - это строка формата. Символ \n в конце строки формата - это символ новой строки, который заставляет курсор переместиться в начало следующей строки.

Пример 2: Печать переменной

Вы также можете использовать printf для печати значения переменной. Например:

Это выведет:

В этом примере %s - это спецификатор формата, который заменяется значением переменной name.

Пример 3: Печать нескольких переменных

Команда printf также может выводить несколько переменных. Например:

Это выведет:

В этом примере первый %s заменяется значением переменной first_name, а второй %s - значением переменной last_name.

Пример 4: Форматирование чисел

Команда printf также может быть использована для форматирования чисел. Например:

Это приведет к выводу:

В этом примере %02d - это спецификатор формата, который заменяется значением переменной num. 02 в %02d указывает, что число должно быть выведено как минимум с двумя цифрами, и при необходимости должны быть добавлены ведущие нули.

Расширенные примеры использования команды Bash printf

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

Пример 1: Печать таблицы

Вы можете использовать команду printf для печати таблицы данных. Например:

В этом примере мы используем флаг -, чтобы выровнять текст по левому краю, и указываем ширину для каждой колонки.

Пример 2: Печать календаря

Вы можете использовать printf для печати календаря. Например:

Это выведет:

В этом примере мы используем printf для печати каждой строки календаря.

Пример 3: Печать индикатора выполнения

Вы можете использовать printf для печати индикатора выполнения. Например:

Это выведет индикатор прогресса, который заполняется в течение 10 секунд:

В этом примере мы используем цикл для обновления индикатора выполнения каждую секунду. Мы используем флаг - для выравнивания текста по левому краю и задаем ширину индикатора выполнения.

Лучшие практики использования команды printf в Bash

При использовании команды printf в сценариях bash следует придерживаться нескольких правил:

  • Всегда используйте двойные кавычки вокруг строки формата и аргументов. Это позволит избежать неожиданного поведения, если строка формата или аргументы содержат пробелы или специальные символы.
  • Всегда используйте опцию -v для сохранения вывода команды printf в переменной, если вы планируете использовать ее позже в своем сценарии. Это более эффективно, чем использование подстановки команд.
  • Всегда указывайте формат для каждого аргумента. Если этого не сделать, printf будет повторно использовать строку формата для каждого аргумента, что может оказаться не тем, что вам нужно.
  • Будьте осторожны при использовании обратных косых черточек в строке формата. Некоторые обратные косые черты, например \n для новой строки, интерпретируются printf, но другие - нет. Если вам нужно использовать обратную косую черту в строке формата, используйте \\\\.
  • При печати таблицы данных используйте флаг -, чтобы выровнять текст по левому краю и указать ширину каждой колонки. Это сделает таблицу более удобной для чтения.
  • При печати чисел используйте соответствующий спецификатор формата (%d для целых чисел, %f для чисел с плавающей точкой и т.д.) и, если необходимо, укажите ширину и точность. Это облегчит чтение чисел.
  • При выводе индикатора выполнения или аналогичного динамического вывода, используйте обратную косую черту \r для перемещения курсора в начало строки. Это позволит вам обновлять вывод на месте.
  • Если вы выводите сложный формат, подумайте о том, чтобы разбить его на несколько команд printf. Это облегчит чтение и сопровождение вашего сценария.
  • Всегда тестируйте команды printf, чтобы убедиться, что они выдают ожидаемый результат. Если вы не уверены, что команда printf будет делать, попробуйте ее в терминале, прежде чем добавлять в сценарий.
  • Наконец, помните, что printf - это мощная команда, которая может делать гораздо больше, чем просто печатать текст. Вы можете использовать ее для форматирования и печати данных различными способами, поэтому не бойтесь экспериментировать и узнавать больше о ее возможностях.

Заключение

В этом руководстве мы рассмотрели команду printf в Bash, мощный инструмент для форматирования и печати данных. Мы изучили ее синтаксис, использование символов с обратным слешем, спецификации преобразования и флаги. Мы также рассмотрели множество практических примеров, от печати простого текста и переменных до создания таблиц и индикаторов выполнения. Гибкость команды printf и контроль над форматированием вывода делают ее незаменимым инструментом в наборе инструментов любого скриптера Bash. В качестве последней рекомендации, всегда помните об использовании двойных кавычек вокруг строк форматирования и аргументов, чтобы избежать непредвиденного поведения, и рассмотрите возможность использования опции -v для сохранения вывода printf для последующего использования в ваших сценариях.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий