Вики / Базовые команды
printf и echo (вывод)
Форматированный вывод в shell — надёжнее echo, форматы и спецсимволы.
echo выводит строку, printf — выводит по формату (как в C) и работает
предсказуемо между системами. В скриптах (bash-scripting) для аккуратного вывода
предпочитают printf. См. также карточку echo.
echo "Привет"
printf '%s\n' "Привет" # %s — строка, \n — перевод строки
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 |
%% |
буквальный процент |
# таблица
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
echo съел/изменил строку с дефисом или бэкслешем
echo "-n" или строки с \ ведут себя непредсказуемо между оболочками. Используй
printf '%s\n' "$var" (см. echo).
printf обрезал/повторил вывод
printf применяет формат ко всем аргументам по кругу. Аргументов больше, чем
%-спецификаторов → формат повторяется (это фича для списков). Меньше → недостающие
= пусто/0.
Нужно собрать строку из переменных
printf -v var '%s-%s' "$a" "$b" — записать в переменную без вывода.
%d: invalid number
В %d пришла не-цифра. Проверь аргумент; для произвольного текста — %s.
printf '%s\n' "$var" # надёжный вывод строки
printf '%-10s %5d\n' name 42 # выравнивание
printf '%.2f\n' 3.14159 # дробное ; %05d — нули
printf -v v '%s' "$x" # в переменную
printf '%(%F)T\n' -1 # дата без date
printf '%q\n' "$s" # экранировать для shell
См. также
- Базовые команды с файлами — Базовые команды
- Bash-скрипты (основы) — Базовые команды
- Текстовые инструменты (sort, uniq, cut, wc, tr) — Базовые команды