Как использовать команду Bash printf в Linux

Опубликовано: 2022-06-25
Терминал Linux на синем фоне.
Фатмавати Ачмад Заэнури/Shutterstock.com

Команда Bash printf позволяет вам писать в окно терминала Linux с более точным контролем и большим количеством параметров форматирования, чем предоставляет команда echo . Даже странные особенности printf могут быть полезны.

Запись в терминал

Это одна из самых основных частей взаимодействия с программой. Программа что-то пишет на экран, а вы это читаете. Даже принимая во внимание принятое в Unix и Linux соглашение о том, что программы командной строки должны быть максимально лаконичными, многие пишут в терминал только в том случае, если что-то идет не так. Информирование пользователя о том, что происходит, или вот-вот произойдет, или только что произошло, является важным программным примитивом.

Как использовать команду Echo в Linux
СВЯЗАННЫЕ Как использовать команду Echo в Linux

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

Команда Bash printf создана по образцу printf из языка C, но есть отличия. Если вы знаете C, вам нужно следить за этими различиями.

Написание базовых строк

Давайте посмотрим, чем отличаются echo и printf , когда они выводят строки на терминал.

 эхо вот несколько слов
 printf вот несколько слов 

Использование echo и printf со словами без кавычек

Команда echo печатает все слова, но printf печатает только первое слово. Кроме того, printf не печатает новую строку. Вывод упирается прямо в командную строку. Но, прежде всего, для того, чтобы printf работал со всеми словами, они должны быть заключены в кавычки.

 эхо вот несколько слов
 printf "вот несколько слов" 

Использование echo и printf со словами в кавычках

Так-то лучше. У нас есть все слова, которые печатаются, но мы все еще не получаем новую строку. Это потому, что с printf вы получаете новую строку только в том случае, если вы ее попросите. Это может показаться болезненным, но это позволяет вам решить, включать ли его или нет. Чтобы заставить printf выдать новую строку, вам нужно включить « \n » в вашу строку. Это escape-последовательность «новой строки».

 эхо вот несколько слов
 printf "вот несколько слов\n" 

Использование echo и printf со словами в кавычках и символом новой строки

Иногда вы будете использовать новую строку, а иногда нет. Вот случай, когда один оператор printf использует новую строку, а другой нет.

 printf "Как сделать" && printf "Компьютерщик\n" 

Использование двух printfs для создания одной строки текста

Поскольку первый printf не печатает новую строку, вывод второго printf располагается сразу после «How-To» и на той же строке. Второй printf использует \n для печати новой строки. Это приводит к тому, что командная строка появляется в строке ниже печатного текста.

СВЯЗАННЫЕ С: Как обрабатывать файл построчно в сценарии Linux Bash

Другие побег-символы

Вот еще несколько escape-символов, которые вы можете использовать. Вы уже видели « \n » в действии.

  • \n : Переход вниз на новую строку.
  • \r : печатает возврат каретки. Это отправляет выходной курсор обратно в начало текущей строки.
  • \t : печатает символ табуляции.
  • \v : печатает вертикальную табуляцию.
  • \\ : печатает символ обратной косой черты.
  • \” : печатает символ кавычки.
  • \b : печатает символ возврата.

Экранирующий символ возврата каретки перемещает курсор обратно в начало текущей строки.

 printf "Мед - корень всех зол\rДеньги\n" 

Использование символа возврата каретки для возврата к началу строки

Команда printf обрабатывает ввод слева направо. Строка печатается как обычный текст до тех пор, пока printf не встретит escape-символ « \r ». Курсор вывода перемещается обратно в начало текущей строки.

Обработка строки возобновляется с буквы сразу после символа « \r ». Обработка остатка приводит к тому, что printf печатает «Money», перезаписывая слово «Honey».

Кавычки « " » используются для заключения строк в кавычки, а символ обратной косой черты « \ » обозначает escape-последовательности. Если вы хотите напечатать эти символы, вам нужно экранировать их с помощью обратной косой черты. Это указывает printf обрабатывать их как буквальные символы.

 printf "Это \tTab, это кавычки\", а это \\ обратная косая черта\n" 

Экранирование символов, чтобы они воспринимались буквально

Использование переменных

Использование переменных с printf очень похоже на их использование с echo . Чтобы включить переменную, такую ​​как эта переменная среды, поставьте перед ней знак доллара « $ », как обычно.

 printf "Домашняя директория: $HOME\n" 

Использование printf с переменной окружения

СВЯЗАННЫЕ С: Как работать с переменными в Bash

Формат строк

Строки формата — это строки, определяющие формат вывода. Вы предоставляете текст и другие значения в качестве аргументов строки формата для работы.

Строка формата может включать текст, escape-последовательности и спецификаторы формата . Спецификаторы формата сообщают printf , какой тип аргумента следует ожидать, например строки, целые числа или символы.

Это наиболее распространенные спецификаторы формата. Им всем предшествует знак процента « % ». Чтобы напечатать знак процента, вы используете два знака процента вместе « %% ».

  • %s : печатает строку.
  • %c : печатает один символ.
  • %d : печатает целое число.
  • %f : печатает число с плавающей запятой.
  • %u : печатает целое число без знака.
  • %o : печатает значение в восьмеричном формате.
  • %x : печатает значение в шестнадцатеричном формате в нижнем регистре.
  • %X : печатает значение в шестнадцатеричном формате в верхнем регистре.
  • %e : печатает число с плавающей запятой в экспоненциальном представлении строчными буквами.
  • %E : печатает число с плавающей запятой в экспоненциальном представлении в верхнем регистре.
  • %% : печатает символ процента «%».
 printf "Как сделать %s\n" "Компьютерщик"
 printf "%s%s %s\n" "Как" "-К" "Гик" 

Отображение printf, принимающего «слишком много» аргументов

Строка формата в первой команде включает собственный текст. Мы передаем строку «Geek» в качестве аргумента printf . Он сопоставляется и печатается со спецификатором формата « %s ». Обратите внимание, что между строкой формата и строкой аргумента есть только пробел. В C вам понадобится запятая, чтобы разделить их, но с версией printf для Bash достаточно использовать пробел.

Вторая строка формата содержит только спецификаторы формата и escape-последовательность новой строки. Три строковых аргумента используются каждым из спецификаторов формата « %s » по очереди. Опять же, в C вам нужно ставить запятую между каждым аргументом, но printf Bash позволяет нам забыть об этом.

Чтобы напечатать различные типы аргументов, вы просто используете соответствующий спецификатор формата. Вот процедура быстрого преобразования чисел, созданная с помощью printf . Мы напечатаем значение 15 в десятичной, восьмеричной и шестнадцатеричной системе счисления.

 printf "Декабрь: %d\nОкт: %o\nHex: %x\n" 15 15 15 

использование printf для печати числовых значений в различных базовых обозначениях

Давайте немного урежем это, чтобы пример был менее загроможденным.

 printf "Шестнадцатеричный: %x\n" 15 

Печать шестнадцатеричного значения

Большинство из нас привыкли видеть шестнадцатеричные значения в верхнем регистре, а значения меньше 0x10 печатаются с начальным нулем. Мы можем добиться этого, используя спецификатор шестнадцатеричного формата в верхнем регистре « %X » и поместив спецификатор ширины между знаком процента « % » и символом « X ».

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

 printf "Шестнадцатеричный: %2X\n" 15 

печать шестнадцатеричного значения в верхнем регистре в поле шириной 2 символа

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

 printf "Шестнадцатеричный: %02X\n" 15 

печать шестнадцатеричного значения в верхнем регистре в поле шириной 2 символа, дополненном нулями

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

 printf "С плавающей запятой: %08.3f\n" 9.243546 

Использование модификаторов ширины и точности с числом с плавающей запятой

Это упрощает создание таблиц результатов с аккуратно выровненными выводами. Следующая команда также демонстрирует еще одну особенность Bash printf . Если аргументов больше, чем спецификаторов формата, аргументы передаются в строку формата пакетами до тех пор, пока не будут использованы все аргументы. Размер пакета, который обрабатывается за раз, равен количеству описателей формата в строке формата. В C дополнительные аргументы в вызовах функции printf игнорируются.

 printf "Плавающая: %8.3f\n" 9.243546 23.665 8.0021 

Использование модификаторов ширины и точности для создания аккуратной таблицы

Вы также можете использовать спецификаторы ширины и точности со строками. Эта команда печатает строки в поле шириной 10 символов.

 printf "%10s %d\n" "пальто" 7 "обувь" 22 "зонтики" 3 

Использование модификатора ширины со строками

По умолчанию значения в своих полях выравниваются по правому краю. Чтобы выровнять их по левому краю, используйте знак минус « - » сразу после знака процента « % ».

 printf "%-10s %d" "пальто" 7 "обувь" 22 "зонтики" 3 

Использование спецификатора ширины с выравниванием по левому краю со строками

Спецификатор точности можно использовать для установки максимального количества печатаемых символов. Мы используем символы двоеточия « : », чтобы показать пределы ширины поля. Не то, как усекается слово «Зонтики».

 printf ":%10.6s:\n" "пальто" "обувь" "зонтики"
 printf ":%-10.6s:\n" "пальто" "обувь" "зонтики" 

Использование модификатора точности для ограничения количества символов, печатаемых из строки

Спецификатор ширины можно даже передать в качестве аргумента . Используйте звездочку « * » вместо числового спецификатора и передайте ширину как целочисленный аргумент.

 printf "%*s\n" 20 "Самый правый" 12 "Средний" 5 "Самый левый" 

Передача спецификатора ширины в качестве аргумента для printf

Другие хитрости и причуды

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

Это печатает сумму двух чисел:

 printf "23+32=%d\n" $((23+32)) 

Печать суммы двух чисел

Эта команда выводит количество каталогов в текущем рабочем каталоге:

 printf "Имеется каталогов: %d\n" $(ls -d */ | wc -l) 

Подсчет каталогов с помощью printf

Эта команда printf печатает строку, возвращаемую вызовом другой команды.

 printf "Текущий пользователь: %s\n" $(whoami) 

Печать вывода другой команды

Если спецификатор строкового формата « %s » не указан с аргументом, printf ничего не печатает.

 printf "Один: %s два: %s\n" "Альфа" 

Как printf работает с отсутствующими строковыми аргументами

Если спецификатор строкового формата « %s » содержит числовое значение по ошибке, он печатает его, как если бы это была строка, и не жалуется. Не пытайтесь делать это с C printf — могут случиться очень плохие вещи. Ваша программа, вероятно, рухнет. Но Bash printf справляется с этим без нареканий.

 printf "Один: %s два: %s\n" "Альфа" 777 

Как printf молча принимает целые числа как строковые значения

Если спецификатор целочисленного формата « %d » не получает аргумента, он напечатает ноль.

 printf "Целое число: %d\n" 

Как printf обрабатывает отсутствующие целочисленные аргументы

Если спецификатор целочисленного формата « %d » получает строковый аргумент по ошибке, Bash напечатает сообщение об ошибке, а printf напечатает ноль.

 printf "Целое число: %d\n" "Семь" 

Как printf обрабатывает строки, предоставленные вместо целочисленных аргументов

Неудобные символы могут быть сгенерированы с использованием их номера Unicode или «кодовой точки». Они экранируются с помощью буквы «u», за которой следует их значение Unicode.

 printf "Символ евро: \u20AC\n" 

Печать экранированного значения Unicode

Чтобы включить escape-последовательности в строки аргументов , вы должны использовать спецификатор формата « %b » в строке формата, а не спецификатор формата строки « %s ».

 printf "%s" "\u20AC\n"
 printf "%b" "\u20AC\n" 

Использование спецификатора формата %b для обработки escape-последовательностей в строковых аргументах

Первый оператор printf не обрабатывает значение Unicode и не распознает escape-последовательность новой строки. Второй оператор printf использует спецификатор формата « %b ». Это правильно обрабатывает символ Unicode, и печатается новая строка.

СВЯЗАННЫЕ С: Что такое кодировки символов, такие как ANSI и Unicode, и чем они отличаются?

Лошади для курсов

Иногда все, что вам нужно сделать, это echo текст в окно терминала. Но когда вам нужно применить позиционирование и форматирование, printf — правильный инструмент для этой работы.

 printf "%b" "Та-" "та-" "та-" "это все ребята.\n"