Команда Bash Printf, объясненная примерами
В этой статье я собираюсь объяснить базовое использование команды Bash printf на примерах в Linux. К концу этой статьи вы научитесь использовать команду printf в сценариях оболочки Bash.
Команда Bash printf
Bash предлагает два типа команд, которые можно использовать для вывода вывода на терминал. Одна из них — команда echo, которая чаще всего используется для этой цели. Вторая — команда printf.
Printf
похожа на функцию printf в языке C, но имеет собственный набор функций. Основное различие между командой echo
и printf
заключается в том, что printf
предлагает форматирование и дополнительные функции по сравнению с командой echo
.
Если вы раньше не использовали команду echo
, у нас есть подробная статья о ней, с которой вам стоит ознакомиться.
- Команда Bash Echo с примерами для Linux
Printf
— это встроенная оболочка оболочки, но вы также можете найти внешнюю команду для printf
. Встроенная команда имеет приоритет над внешней командой. Вы можете получить эту информацию, выполнив команду type
, как показано ниже.
$ type -a printf
printf is a shell builtin
printf is /usr/bin/printf
printf is /bin/printf
Более подробную информацию о команде type
можно найти в следующем руководстве:
- Учебное пособие по командам Type с примерами для начинающих
Если вы хотите запустить внешнюю версию printf
, вам необходимо указать полный путь к каталогу, в котором находится двоичный файл.
printf "Hello World\n" # SHELL BUILTIN
/usr/bin/printf "Hello World\n" # EXTERNAL VERSION OF PRINTF
Встроенная и внешняя команда
Отображение справки по Bash printf
Как я упоминал в предыдущем разделе, printf
встроен в bash. Вам нужно открыть справочную страницу bash
и перейти к разделу printf
.
man bash
/printf → presss
Печать справки
Вы также можете запустить следующую команду, которая отобразит раздел справки по printf
на странице руководства bash
.
man bash | less --pattern='^ *printf +['
Основная форма команды printf
В примерах я буду сравнивать команду printf
с командой echo
, чтобы понять их сходство.
Ниже приведен формат команды printf
:
printf [-v var] format [arguments]
Аргументы должны передаваться в printf
, иначе произойдет ошибка, как показано на рисунке ниже.
printf
echo $?
Printf без аргументов
Передайте аргумент и снова запустите команду printf
. В приведенном ниже примере вы можете видеть, что я добавил \n, который является символом новой строки. По умолчанию printf
не добавит новую строку, как команда echo
, поэтому вам придется добавить \n
.
printf "Linux is fun to work with" # WITHOUT NEW LINE
printf "Linux is fun to work with\n" # WITH NEW LINE
Printf с символом новой строки
Переменные и интерпретация команд
Вы можете включать любые переменные или запускать команды в оператор printf
. Это поведение похоже на команду echo
.
VAR1="Linux"
printf "$VAR1 is fun to work with\n"
Интерпретация переменных и команд
Рекомендуем прочитать:
- Сценарии Bash: переменные, поясняемые примерами
Поведение одинарных и двойных кавычек
Когда вы заключаете свои аргументы в одинарные кавычки, переменная и команда будут обрабатываться как обычный текст. Такое же поведение наблюдается и в команде echo
. Вам необходимо заключить аргументы в двойные кавычки, если вы хотите, чтобы переменная и команда были расширены.
printf '$VAR1 is fun to work with\n'
printf 'Today date = $(date)\n'
Использование одинарных кавычек
Когда вы передаете аргументы без кавычек, printf
будет рассматривать в качестве аргумента только первое слово и распечатывать его. Поэтому необходимо использовать кавычки вокруг printf
.
printf Today date = $(date)\n
Аргументы без кавычек
Перенаправление и передача вывода
По умолчанию printf
отправляет выходные данные на стандартный вывод (терминал). Вы можете перенаправить вывод в файл с помощью оператора перенаправления или объединить его с оператором конвейера для дальнейшей обработки.
PRINT TO STDOUT
printf "Today date = $(date)\n"
REDIRECT TO A FILE
printf "Today date = $(date)\n" > /tmp/tdy.txt
cat /tmp/tdy.txt
PIPE
printf "Today date = $(date)\n" | grep -i -o IST
Перенаправление и конвейеризация
Связанное чтение:
- Перенаправление Bash, объясненное примерами
Присвоение вывода переменной
Иногда вам может потребоваться сохранить вывод printf
в переменную и использовать его позже для некоторой обработки. Обычно вы запускаете printf
, заключенный в скобки, который запускает команду и присваивает выходные данные переменной.
ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
printf $ZONE
Выход присвоен переменной
Альтернативно вы можете использовать флаг -v
вместе с printf
для сохранения вывода в переменной. Вам необходимо передать имя переменной после флага -v
.
printf -v TIME "Today date = $(date)\n"
echo $TIME
Сохранить вывод в переменную
Многострочный оператор printf
Если вам нужно напечатать более одной строки, вы можете заключить текст в двойные кавычки. Аналогично, если у вас есть огромная строка, которую нужно напечатать как одну строку, и вы хотите записать ее в несколько строк для лучшей читаемости кода, вы можете использовать обратную косую черту в конце каждой строки, где следующая строка будет рассматриваться как продолжение предыдущей строки.
printf "\n I am running PoP_OS
It is a great OS
With Great features\n"
printf "I am running pop_os \
It is a great OS \
With Great features\n"
Многострочный оператор printf
Обратная косая черта, экранирующие символы
Вы можете использовать следующие символы с обратной косой чертой в printf
.
- Символ новой строки (\n)
- Горизонтальная вкладка (\t) и вертикальная вкладка (\v)
- Символ возврата (\b)
- Возврат каретки (\r)
Давайте обсудим один за другим с примерами.
Символ новой строки (\n)
Мы уже видели символ новой строки (\n
) во всех предыдущих разделах. Символ новой строки (\n
) добавит новую строку.
printf "Today date = $(date)\n"
Символ новой строки
Горизонтальная вкладка (\t) и вертикальная вкладка (\v)
Горизонтальные и вертикальные символы табуляции используются для добавления пробелов к вашим аргументам printf
.
printf "Today date \t $(date)\n" # HORIZONTAL TAB
printf "Today date \v $(date)\n" # VERTICAL TAB
Горизонтальная и вертикальная вкладка
Символ возврата (\b)
Символ возврата (\b
) удалит одну букву. Это похоже на нажатие клавиши Backspace на нашей клавиатуре.
printf "It's a rain\by day..\n"
Символ возврата
Возврат каретки (\r)
Курсор возвращается в первую позицию при использовании возврата каретки (\r
). Все, что идет после \r
, будет заменять символы из первой позиции.
printf "It's a rain\by\r day..\n"
Возврат каретки
Экранирующий символ обратной косой черты (\)
Если вы хотите экранировать специальные символы (\n
, \t
, \v
, \b
, \r
) и воспринимайте его как строку, а затем добавляйте к нему двойную обратную косую черту (\\
).
printf "It's a rain\\by\\r day..\n"
Выход с обратной косой чертой
Что бы вы ни видели до сих пор, тот же набор операций вы можете найти и в команде echo
. Если вы уже знакомы с командой echo
, к этому моменту вы уже вполне освоитесь и с командой printf
.
Спецификаторы формата Printf
Спецификаторы формата — это способ подставить значение в printf
вместо жесткого кодирования значения в printf
. Для замены используется множество букв, и каждая буква представляет определенный тип данных. При использовании спецификатора необходимо добавлять к нему префикс %
. Давайте посмотрим на некоторые часто используемые спецификаторы формата.
Спецификатор строки (%s)
Если вы хотите поместить какие-либо строки внутри printf
, вам нужно использовать %s
. Взгляните на приведенный ниже пример. У меня есть оператор printf
, и я хочу заменить значение "United" внутри printf
. Таким образом, используется %s
, который является строковым спецификатором, и при запуске команды вместо %s
будет заменено значение "united". .
printf "++ Manchester %s has a strong lineup this season" "United"
Замена строки
Вы можете передать столько аргументов подстановки, сколько захотите, и вам придется использовать одинаковое количество спецификаторов внутри аргумента.
printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"
Заменить несколько аргументов
Что, если будет использовано меньше спецификаторов и больше аргументов?
Взгляните на приведенный ниже пример. Вначале я использовал только один спецификатор и передал три аргумента (строки) для замены. printf
обрабатывает это следующим образом: он начинает заменять первый аргумент в первом спецификаторе, а следующий аргумент снова будет передан первому спецификатору, поскольку других спецификаторов нет. Таким образом, произойдут три замены, которые на самом деле неправильны и получат желаемый результат.
printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"
Пройдено больше аргументов
Есть некоторые случаи использования, когда такое поведение имеет смысл. Взгляните на приведенный ниже пример. Я хочу напечатать приветственное сообщение для некоторых игроков и передать их имена в качестве аргументов. Обычно вы можете сохранить список имен в массиве, пройтись по нему и распечатать сообщение. Но это эффективный способ добиться результата, избегая использования циклов.
$ printf "++ Welcome %s to manchester united\n" "Ronaldo" "Varane" "Jadon Sancho\n"
++ Welcome Ronaldo to manchester united
++ Welcome Varane to manchester united
++ Welcome Jadon Sancho to manchester united
Несколько аргументов с одним спецификатором
Десятичное целое число со знаком (%d) и десятичное целое число без знака (%u)
Чтобы заменить целые числа со знаком, используйте %d
.
printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25
Целые числа со знаком
Чтобы заменить целые числа без знака, используйте %u
.
printf "UNSIGNED INTEGER = %u\n" 10
Беззнаковые целые числа
Если вы попытаетесь заменить любой тип данных, кроме целого, вы получите ошибку.
printf ">> Ronaldo gets no %d\n" seven
Замените неправильный тип данных
Число с плавающей запятой (%f)
Чтобы заменить числа с плавающей запятой, используйте %f
.
printf "Integer 100 to floating-point %f\n" 100
Замена с плавающей запятой
Интерпретация escape-последовательности обратной косой черты
Вы можете передавать escape-последовательности обратной косой черты в качестве аргументов и использовать %b
, который будет интерпретировать и расширять escape-последовательность обратной косой черты.
printf "Welcome to %b Manchester united %b" "\v" "\n"
Escape-последовательность с обратной косой чертой
Директивы преобразования Printf
Существуют дополнительные модификаторы преобразования, которые можно использовать для форматирования выходных данных printf
.
%[flags][width][.precision]specifier
Модификатор ширины
Модификатор ширины определяет минимальное количество символов при преобразовании. Если количество символов меньше, то перед ними будут стоять пробелы, как показано ниже.
printf "%10s\n" "Ronaldo"
Модификатор ширины
Если вы посмотрите на изображение выше, спецификатор (Рональдо) состоит из 7 символов, а ширина указана как 10. В этом случае будут добавлены пробелы для выравнивания ширины 10.
Вы также можете использовать модификаторы флагов для выравнивания или добавлять нули вместо пробелов. Например, если вывод необходимо выровнять по левому краю, вы можете добавить модификатор флага дефис (-
).
printf "%-10s\n" "Ronaldo"
Выравнивание
В случае целочисленных значений и значений с плавающей запятой вы можете заменить пробел на нули, добавив модификатор флага ноль (0).
printf "%010d \n" 7
Заменить пробел нулями
Модификатор точности
Это необязательный параметр, который можно использовать для определения количества печатаемых строк, целых чисел и позиций с плавающей запятой. Вам нужно использовать точку(.), за которой следует целое число, чтобы определить количество позиций для печати.
Взгляните на приведенный ниже пример. Я использую спецификатор строки и устанавливаю модификатор точности равным четырем.
printf "%.7s\n" "Ronaldo has joined Manu"
Модификатор точности строки
Вместо точных целочисленных значений можно передавать звездочки (*
). Звездочки будут принимать аргументы точности вместо жесткого кодирования значения точности.
printf "%.*s\n" 7 "Ronaldo has joined Manu"
Модификатор точности звездочек
Заключение
В этой статье мы рассмотрели довольно много информации о команде Bash printf. Чтобы комфортно использовать printf
, просто попрактикуйтесь во всех примерах, приведенных в статье. Printf обладает гораздо более мощными возможностями форматирования, чем примеры, которые я показал в этой статье. Если вам знакомы основы, в зависимости от варианта использования вы можете эффективно использовать printf
.
Связанное чтение:
- Скрипты Bash: индексированные массивы с примерами
- Скрипты Bash: объяснение ассоциативных массивов на примерах
- Скрипты Bash: циклы while и Until с примерами
- Скрипты Bash: цикл For с примерами
- Скрипты Bash: функции, поясняемые примерами
- Руководство по Bash Heredoc для начинающих