Команда printf в Shell

В предыдущей главе мы изучили команду Shell echo. В этой главе мы изучим другую команду вывода Shell — printf.

printf(print formatted) — это команда Shell для форматированного вывода, произошедшая из языка Cprintf()функцию.

иechoВ отличие от,printfона не добавляет автоматически символы новой строки и позволяет точно управлять форматом вывода.

printf определена стандартом POSIX, поэтому сценарии, использующие printf, более переносимы, чем те, что используют echo.

printf использует текст в кавычках или аргументы, разделённые пробелами, и вы можетеprintfиспользовать в нём строки формата, а также указывать ширину строки, выравнивание по левому/правому краю и т. д. По умолчанию printf, в отличие отecho, не добавляет автоматически переводы строк; мы можем добавить их вручную.\n。

Зачем использовать printf?

  1. Управление форматом: можно указать ширину поля, точность и выравнивание.
  2. Безопасность типов: разные типы данных (целые числа, числа с плавающей точкой, строки и т. д.) имеют соответствующие спецификаторы формата.
  3. Переносимость: поведение более согласовано в разных системах и оболочках.
  4. Сложный вывод: подходит для генерации структурированного вывода, например таблиц и отчётов.

Базовый синтаксис

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

printf  format-string  [arguments...]

Описание параметра:

  • format-string: строка, содержащая обычные символы и спецификаторы формата.
  • arguments...: переменные или значения, соответствующие спецификаторам формата.

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

  • %s: Строка
  • %d: Десятичное целое число
  • %f: Число с плавающей запятой
  • %c: Символ
  • %x: Шестнадцатеричное число
  • %o: Восьмеричное число
  • %b: Двоичное число
  • %e: Число с плавающей запятой в экспоненциальной записи

Рабочий процесс

  1. Разобрать строку формата; выводить обычные символы непосредственно при обнаружении.
  2. Когда спецификатор формата (начинающийся с%в начале) встречается:
    • Прочитать следующий аргумент.
    • Обработать аргумент в соответствии с форматом, указанным спецификатором.
    • Вставить результат в вывод.
  3. После обработки всех спецификаторов формата вывести окончательный результат.

Практические примеры

1. Базовое использование

Пример

# Простой вывод строки
printf "Hello, World!\n"

# Вывод с переменными
name="Alice"
printf "Hello, %s\n" "$name"

Выполнение и вывод:

Пример

$ bash script.sh
Hello, World!
Hello, Alice

2. Common Format Specifiers

Пример

# Integer
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 255 255 255

# Floating point
printf "Float: %f\nScientific: %e\n" 3.14159 3.14159

# String
printf "Name: %s\n" "Bob"

# Character
printf "First letter: %c\n" "A"

Результат выполнения:

Decimal: 255
Hex: ff
Octal: 377
Float: 3.141590
Scientific: 3.141590e+00
Name: Bob
First letter: A

3. Управление форматированием

Пример

# Ширина поля и выравнивание
printf "|%10s|\n|%-10s|\n" "право" "лево"

# Ведущие нули в числах
printf "Год: %04d\n" 23

# Точность чисел с плавающей запятой
printf "Пи: %.2f\n" 3.14159

Результат выполнения:

|     right|
|left      |
Year: 0023
Pi: 3.14

4. Обработка нескольких аргументов

Пример

printf "%-10s %5d %8.2f\n" "Яблоко" 5 2.5 "Апельсин" 3 1.75

Результат выполнения:

Apple          5     2.50
Orange         3     1.75

Расширенное применение

1. Создание табличного вывода

Пример

#!/bin/bash

# Заголовок
printf "%-15s %10s %10s %10s\n" "Товар" "Количество" "Цена" "Итого"

# Разделительная линия
printf "%-15s %10s %10s %10s\n" "---------------" "----------" "----------" "----------"

# Строки данных
printf "%-15s %10d %10.2f %10.2f\n" "Блокнот" 3 2.50 7.50
printf "%-15s %10d %10.2f %10.2f\n" "Ручка" 5 1.20 6.00
printf "%-15s %10d %10.2f %10.2f\n" "Ластик" 2 0.50 1.00

# Строка итогов
printf "%-15s %10s %10s %10.2f\n" "" "" "Итого:" 14.50

Результат вывода:

Item            Quantity      Price      Total
--------------- ---------- ---------- ----------
Notebook               3       2.50       7.50
Pen                    5       1.20       6.00
Eraser                 2       0.50       1.00
                       Total:             14.50

2. Реализация индикатора выполнения

Пример

#!/bin/bash

for i in {1..20}; do
    printf "\rПрогресс: [%-20s] %d%%" $(printf "%${i}s" | tr ' ' '#') $((i*5))
    sleep 0.1
done
printf "\n"

Эффект выполнения: Отображает постепенно растущий индикатор выполнения.

3. Цветной вывод

Пример

#!/bin/bash

RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # Нет цвета

printf "${RED}Ошибка:${NC} Что-то пошло не так\n"
printf "${GREEN}Успех:${NC} Операция завершена\n"

4. Форматированный вывод

Далее я продемонстрирую мощные возможности printf с помощью скрипта:

Пример

#!/bin/bash
# автор: Пример
# url:www.example.com
 
printf "%-10s %-8s %-4s\n"Имя Пол Вес кг
printf "%-10s %-8s %-4.2f\n"Го Цзин Мужской66.1234
printf "%-10s %-8s %-4.2f\n"Ян Го Мужской48.6543
printf "%-10s %-8s %-4.2f\n"Го Фу Женский47.9876

Выполните скрипт, и вывод будет следующим:

姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99

%s %c %d %fВсе они — спецификаторы формата.%sВыводит строку,%dвывод целого числа,%cвыводит символ,%fвыводит вещественное число в десятичной форме.

%-10sОбозначает ширину в 10 символов (-указывает выравнивание по левому краю; без него используется выравнивание по правому краю. Любые символы будут отображаться в пределах ширины 10 символов. Если символов недостаточно, автоматически добавляются пробелы; если символов больше, содержимое всё равно отображается полностью.

%-4.2fОбозначает форматирование как десятичное число, где.2обозначает сохранение 2 знаков после запятой.

Пример

#!/bin/bash
# автор: Пример
# url:www.example.com
 
# format-string использует двойные кавычки
printf "%d %s\n" 1 "abc"

# Одинарные кавычки дают тот же эффект, что и двойные кавычки
printf '%d %s\n' 1 "abc"

# Вывод также можно осуществлять без кавычек
printf %s abcdef

# Формат указывает только один аргумент, но дополнительные аргументы всё равно выводятся согласно этому формату; format-string используется повторно
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# Если нет аргументов, %s заменяется на NULL, а %d — на 0
printf "%s и %d \n"

Выполните скрипт, и вывод будет следующим:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

Управляющие последовательности printf

ПоследовательностьОписание
\aСимвол оповещения, обычно символ ASCII BEL.
\bВозврат на один символ
\cПодавляет (не отображает) любой завершающий символ новой строки в выходном результате (допустимо только в строках аргументов, управляемых спецификатором формата %b). Кроме того, любые оставшиеся символы в аргументе, любые последующие аргументы и любые оставшиеся символы в строке формата игнорируются.
\fПодача страницы
\n Перевод строки
\rВозврат каретки
\tГоризонтальная табуляция
\vВертикальная табуляция
\\Литеральный символ обратной косой черты
\ddd Символ, представляющий восьмеричное значение от 1 до 3 цифр. Допустимо только в строке формата.
\0dddСимвол, представляющий восьмеричное значение от 1 до 3 цифр.

Пример

$ printf "строка, без обработки:<%s>\n" "A\nB"
строка, без обработки:<A\nB>

$ printf "строка, без обработки:<%b>\n" "A\nB"
строка, без обработки:<A
B>

$ printf "www.example.com \a"
www.example.com $                  # Нет перевода строки

Сводка ключевых моментов

Повторение ключевых знаний

Концепция Описание Пример
Базовый синтаксис printf "format" args printf "%s" "hello"
Спецификатор формата Начинается с %, указывает тип данных и формат. %d(integer),%f(с плавающей запятой)
Экранирующий символ Представление специальных символов \n(новая строка),\t(табуляция)
Ширина поля Управляет минимальной шириной вывода %10s(10 символов в ширину)
Управление точностью Количество десятичных знаков для чисел с плавающей запятой %.2f(2 знака после запятой)

Краткая справочная таблица распространённых спецификаторов формата

Спецификатор Назначение Пример ввода Пример вывода
%s String "text" text
%d Десятичное целое число 255 255
%x Шестнадцатеричное целое число 255 ff
%f Число с плавающей запятой 3.14159 3.141590
%.2f 2 знака после запятой 3.14159 3.14
%c Одиночный символ "A" A
%% Знак процента - %
Другие расширения