С чего начать Первые шаги трек · 15 ступеней
Linux Labs

printf и echo — вывод текста в скриптах

4 мин bash / coreutils

Команда printf — форматированный вывод в shell: надёжнее echo, форматы и спецсимволы.

Шпаргалка

7 команд Версия для печати
  • printf '%s\n' "$var" надёжный вывод строки
  • printf '%-10s %5d\n' name 42 выравнивание
  • printf '%.2f\n' 3.14159 два знака после точки
  • printf '%05d\n' 42 ведущие нули
  • printf -v v '%s' "$x" в переменную
  • printf '%(%F)T\n' -1 дата без date
  • printf '%q\n' "$s" экранировать для shell

Обзор

echo выводит строку, printf — выводит по формату (как в C) и работает предсказуемо между системами. В скриптах (bash-scripting) для аккуратного вывода предпочитают printf. См. также карточку echo.

bash
echo "Привет"
printf '%s\n' "Привет"            # %s — строка, \n — перевод строки

Ключи

4

У printf практически нет собственных ключей — управление идёт через строку формата; исключение — -v, который пишет результат в переменную вместо вывода. У echo ключи, наоборот, определяют всё поведение: -n убирает перевод строки, -e/-E включают и выключают интерпретацию \n/\t в аргументе — поведение по умолчанию для -e отличается между echo bash и /bin/echo, поэтому в скриптах надёжнее printf.

Ключ Что делает Пример
-v var printf: записать результат в переменную вместо вывода на экран. printf -v stamp '%(%Y%m%d)T' -1
-n echo: не выводить завершающий перевод строки. echo -n "no newline"
-e echo: интерпретировать escape-последовательности (\n, \t) в аргументе. echo -e "a\tb"
-E echo: не интерпретировать escape-последовательности (поведение по умолчанию). echo -E "a\tb"

Ничего не найдено. Попробуй запрос короче.

Рецепты

2

Формат

bash
printf '%s = %d\n' "порт" 80                  # порт = 80
printf '%-10s %5d\n' "nginx" 1234             # выравнивание: лево 10, право 5
printf '%.2f\n' 3.14159                        # 3.14 (два знака)
printf '%05d\n' 42                             # 00042 (ведущие нули)
printf '%x %o %b\n' 255 8 'a\tb'              # ff / 10 / a<таб>b (%b — escape в аргументе)
printf '%q\n' "a b'c"                          # безопасно экранировать для shell
printf 'IP: %s\tПорт: %s\n' 10.0.0.1 80        # \t — табуляция
printf '%(%Y-%m-%d)T\n' -1                     # дата без вызова date (bash)
Спецификатор Значение
%s %d %f строка / целое / дробное
%-Ns %Nd ширина N (- = по левому краю)
%.Nf N знаков после точки
%05d ведущие нули
%x %o hex / oct
%b строка с интерпретацией \n \t
%q экранировать для повторного ввода в shell
%% буквальный процент

Рецепты

bash
# таблица
printf '%-15s %-8s %s\n' ИМЯ PID СОСТОЯНИЕ
printf '%-15s %-8d %s\n' nginx 1234 running

# формат повторяется по кругу для лишних аргументов:
printf '%s\n' a b c                # a / b / c построчно

# собрать строку в переменную (без вывода):
printf -v stamp '%(%Y%m%d-%H%M%S)T' -1
echo "backup-$stamp.tar.gz"

# повторить символ N раз (разделитель):
printf '=%.0s' {1..40}; echo

Неполадки

4

echo съел/изменил строку с дефисом или бэкслешем

echo "-n" или строки с \ ведут себя непредсказуемо между оболочками. Используй printf '%s\n' "$var" (см. echo).

printf обрезал/повторил вывод

printf применяет формат ко всем аргументам по кругу. Аргументов больше, чем %-спецификаторов → формат повторяется (это фича для списков). Меньше → недостающие = пусто/0.

Нужно собрать строку из переменных

printf -v var '%s-%s' "$a" "$b" — записать в переменную без вывода.

%d: invalid number

В %d пришла не-цифра. Проверь аргумент; для произвольного текста — %s.

См. также

  • bash-scripting — Переменные, условия, циклы, аргументы и безопасный режим set -euo pipefail.
  • text-tools — Обработка текста и потоков — сортировка, уникальность, столбцы, подсчёт.
  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
Загрузка…