linux-labs

Вики / Базовые команды

printf и echo (вывод)

Команда bash / coreutils БазовоеТекст и потоки

Форматированный вывод в 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

См. также