Команда printf в Shell
В предыдущей главе мы изучили команду Shell echo. В этой главе мы изучим другую команду вывода Shell — printf.
printf(print formatted) — это команда Shell для форматированного вывода, произошедшая из языка Cprintf()функцию.
иechoВ отличие от,printfона не добавляет автоматически символы новой строки и позволяет точно управлять форматом вывода.
printf определена стандартом POSIX, поэтому сценарии, использующие printf, более переносимы, чем те, что используют echo.
printf использует текст в кавычках или аргументы, разделённые пробелами, и вы можетеprintfиспользовать в нём строки формата, а также указывать ширину строки, выравнивание по левому/правому краю и т. д. По умолчанию printf, в отличие отecho, не добавляет автоматически переводы строк; мы можем добавить их вручную.\n。
Зачем использовать printf?
- Управление форматом: можно указать ширину поля, точность и выравнивание.
- Безопасность типов: разные типы данных (целые числа, числа с плавающей точкой, строки и т. д.) имеют соответствующие спецификаторы формата.
- Переносимость: поведение более согласовано в разных системах и оболочках.
- Сложный вывод: подходит для генерации структурированного вывода, например таблиц и отчётов.
Базовый синтаксис
Синтаксис команды printf:
printf format-string [arguments...]
Описание параметра:
- format-string: строка, содержащая обычные символы и спецификаторы формата.
- arguments...: переменные или значения, соответствующие спецификаторам формата.
Спецификаторы формата начинаются с символа%, за которым следует один или несколько символов, используемых для указания формата вывода. Распространённые спецификаторы формата включают:
%s: Строка%d: Десятичное целое число%f: Число с плавающей запятой%c: Символ%x: Шестнадцатеричное число%o: Восьмеричное число%b: Двоичное число%e: Число с плавающей запятой в экспоненциальной записи
Рабочий процесс
- Разобрать строку формата; выводить обычные символы непосредственно при обнаружении.
- Когда спецификатор формата (начинающийся с
%в начале) встречается:- Прочитать следующий аргумент.
- Обработать аргумент в соответствии с форматом, указанным спецификатором.
- Вставить результат в вывод.
- После обработки всех спецификаторов формата вывести окончательный результат.
Практические примеры
1. Базовое использование
Пример
printf "Hello, World!\n"
# Вывод с переменными
name="Alice"
printf "Hello, %s\n" "$name"
Выполнение и вывод:
Пример
Hello, World!
Hello, Alice
2. Common Format Specifiers
Пример
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. Обработка нескольких аргументов
Пример
Результат выполнения:
Apple 5 2.50 Orange 3 1.75
Расширенное применение
1. Создание табличного вывода
Пример
# Заголовок
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. Реализация индикатора выполнения
Пример
for i in {1..20}; do
printf "\rПрогресс: [%-20s] %d%%" $(printf "%${i}s" | tr ' ' '#') $((i*5))
sleep 0.1
done
printf "\n"
Эффект выполнения: Отображает постепенно растущий индикатор выполнения.
3. Цветной вывод
Пример
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # Нет цвета
printf "${RED}Ошибка:${NC} Что-то пошло не так\n"
printf "${GREEN}Успех:${NC} Операция завершена\n"
4. Форматированный вывод
Далее я продемонстрирую мощные возможности printf с помощью скрипта:
Пример
# автор: Пример
# 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 знаков после запятой.
Пример
# автор: Пример
# 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 цифр. |
Пример
строка, без обработки:<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 |
%% |
Знак процента | - | % |