Как использовать команду Bash printf в Linux
Опубликовано: 2022-06-25
Команда Bash printf
позволяет вам писать в окно терминала Linux с более точным контролем и большим количеством параметров форматирования, чем предоставляет команда echo
. Даже странные особенности printf
могут быть полезны.
Запись в терминал
Это одна из самых основных частей взаимодействия с программой. Программа что-то пишет на экран, а вы это читаете. Даже принимая во внимание принятое в Unix и Linux соглашение о том, что программы командной строки должны быть максимально лаконичными, многие пишут в терминал только в том случае, если что-то идет не так. Информирование пользователя о том, что происходит, или вот-вот произойдет, или только что произошло, является важным программным примитивом.
Оболочка Bash имеет команду echo
, которая может записывать текст в окно терминала. Он может обрабатывать переменные и отображать их значения, если они включены в строку, и вы можете использовать его в сценариях или в командной строке. Так почему printf
вообще существует? Разве echo
не покрывает написание текста? Что ж, printf
предлагает функциональные возможности, выходящие за рамки обычного акта записи строк в окна терминала. Он позволяет форматировать вывод с большой гибкостью, а также имеет другие приемы.
Команда Bash printf
создана по образцу printf
из языка C, но есть отличия. Если вы знаете C, вам нужно следить за этими различиями.
Написание базовых строк
Давайте посмотрим, чем отличаются echo
и printf
, когда они выводят строки на терминал.
эхо вот несколько слов
printf вот несколько слов
Команда echo
печатает все слова, но printf
печатает только первое слово. Кроме того, printf
не печатает новую строку. Вывод упирается прямо в командную строку. Но, прежде всего, для того, чтобы printf
работал со всеми словами, они должны быть заключены в кавычки.
эхо вот несколько слов
printf "вот несколько слов"
Так-то лучше. У нас есть все слова, которые печатаются, но мы все еще не получаем новую строку. Это потому, что с printf
вы получаете новую строку только в том случае, если вы ее попросите. Это может показаться болезненным, но это позволяет вам решить, включать ли его или нет. Чтобы заставить printf
выдать новую строку, вам нужно включить « \n
» в вашу строку. Это escape-последовательность «новой строки».
эхо вот несколько слов
printf "вот несколько слов\n"
Иногда вы будете использовать новую строку, а иногда нет. Вот случай, когда один оператор printf
использует новую строку, а другой нет.
printf "Как сделать" && printf "Компьютерщик\n"
Поскольку первый 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"
СВЯЗАННЫЕ С: Как работать с переменными в Bash
Формат строк
Строки формата — это строки, определяющие формат вывода. Вы предоставляете текст и другие значения в качестве аргументов строки формата для работы.
Строка формата может включать текст, escape-последовательности и спецификаторы формата . Спецификаторы формата сообщают printf
, какой тип аргумента следует ожидать, например строки, целые числа или символы.
Это наиболее распространенные спецификаторы формата. Им всем предшествует знак процента « %
». Чтобы напечатать знак процента, вы используете два знака процента вместе « %%
».
- %s : печатает строку.
- %c : печатает один символ.
- %d : печатает целое число.
- %f : печатает число с плавающей запятой.
- %u : печатает целое число без знака.
- %o : печатает значение в восьмеричном формате.
- %x : печатает значение в шестнадцатеричном формате в нижнем регистре.
- %X : печатает значение в шестнадцатеричном формате в верхнем регистре.
- %e : печатает число с плавающей запятой в экспоненциальном представлении строчными буквами.
- %E : печатает число с плавающей запятой в экспоненциальном представлении в верхнем регистре.
- %% : печатает символ процента «%».
printf "Как сделать %s\n" "Компьютерщик"
printf "%s%s %s\n" "Как" "-К" "Гик"
Строка формата в первой команде включает собственный текст. Мы передаем строку «Geek» в качестве аргумента printf
. Он сопоставляется и печатается со спецификатором формата « %s
». Обратите внимание, что между строкой формата и строкой аргумента есть только пробел. В C вам понадобится запятая, чтобы разделить их, но с версией printf
для Bash достаточно использовать пробел.
Вторая строка формата содержит только спецификаторы формата и escape-последовательность новой строки. Три строковых аргумента используются каждым из спецификаторов формата « %s
» по очереди. Опять же, в C вам нужно ставить запятую между каждым аргументом, но printf
Bash позволяет нам забыть об этом.

Чтобы напечатать различные типы аргументов, вы просто используете соответствующий спецификатор формата. Вот процедура быстрого преобразования чисел, созданная с помощью printf
. Мы напечатаем значение 15 в десятичной, восьмеричной и шестнадцатеричной системе счисления.
printf "Декабрь: %d\nОкт: %o\nHex: %x\n" 15 15 15
Давайте немного урежем это, чтобы пример был менее загроможденным.
printf "Шестнадцатеричный: %x\n" 15
Большинство из нас привыкли видеть шестнадцатеричные значения в верхнем регистре, а значения меньше 0x10 печатаются с начальным нулем. Мы можем добиться этого, используя спецификатор шестнадцатеричного формата в верхнем регистре « %X
» и поместив спецификатор ширины между знаком процента « %
» и символом « X
».
Это сообщает printf
ширину поля, в котором должен быть напечатан аргумент. Поле дополняется пробелами. В этом формате двузначные значения будут печататься без каких-либо дополнений.
printf "Шестнадцатеричный: %2X\n" 15
Теперь мы получаем значение в верхнем регистре, напечатанное с начальным пробелом. Мы можем заставить printf
заполнить поле нулями вместо пробелов, поставив ноль перед двумя:
printf "Шестнадцатеричный: %02X\n" 15
Спецификатор точности позволяет вам установить количество десятичных знаков, которые будут включены в вывод.
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 "23+32=%d\n" $((23+32))
Эта команда выводит количество каталогов в текущем рабочем каталоге:
printf "Имеется каталогов: %d\n" $(ls -d */ | wc -l)
Эта команда printf
печатает строку, возвращаемую вызовом другой команды.
printf "Текущий пользователь: %s\n" $(whoami)
Если спецификатор строкового формата « %s
» не указан с аргументом, printf
ничего не печатает.
printf "Один: %s два: %s\n" "Альфа"
Если спецификатор строкового формата « %s
» содержит числовое значение по ошибке, он печатает его, как если бы это была строка, и не жалуется. Не пытайтесь делать это с C printf
— могут случиться очень плохие вещи. Ваша программа, вероятно, рухнет. Но Bash printf
справляется с этим без нареканий.
printf "Один: %s два: %s\n" "Альфа" 777
Если спецификатор целочисленного формата « %d
» не получает аргумента, он напечатает ноль.
printf "Целое число: %d\n"
Если спецификатор целочисленного формата « %d
» получает строковый аргумент по ошибке, Bash напечатает сообщение об ошибке, а printf
напечатает ноль.
printf "Целое число: %d\n" "Семь"
Неудобные символы могут быть сгенерированы с использованием их номера Unicode или «кодовой точки». Они экранируются с помощью буквы «u», за которой следует их значение Unicode.
printf "Символ евро: \u20AC\n"
Чтобы включить escape-последовательности в строки аргументов , вы должны использовать спецификатор формата « %b
» в строке формата, а не спецификатор формата строки « %s
».
printf "%s" "\u20AC\n"
printf "%b" "\u20AC\n"
Первый оператор printf
не обрабатывает значение Unicode и не распознает escape-последовательность новой строки. Второй оператор printf
использует спецификатор формата « %b
». Это правильно обрабатывает символ Unicode, и печатается новая строка.
СВЯЗАННЫЕ С: Что такое кодировки символов, такие как ANSI и Unicode, и чем они отличаются?
Лошади для курсов
Иногда все, что вам нужно сделать, это echo
текст в окно терминала. Но когда вам нужно применить позиционирование и форматирование, printf
— правильный инструмент для этой работы.
printf "%b" "Та-" "та-" "та-" "это все ребята.\n"