English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Команда printf в Shell

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

Команда printf имитирует функцию printf() из библиотеки программного обеспечения C.

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

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

printf команды грамматика:

printf  format-string  [arguments...]

参数说明:

  • format-string: является строкой форматирования

  • arguments: является списком параметров.

$ echo "Привет, Shell"
Привет, Shell
$ printf "Привет, Shell\n"
Привет, Shell
$

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

#!/bin/bash
# author:базовый учебник
# url:ru.oldtoolbag.com
 
printf "%%-10s %%-8s %%-4s\n" Имя Пол Весkg  
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
# author:базовый учебник
# url:ru.oldtoolbag.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
# Если нету arguments,то %%s заменяется на NULL,%%d заменяется на 0
printf "%%s %%d \n"

Выполнение скрипта, результат вывода следующий:

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

Эскапационные последовательности printf

СerieОписание
\aВспомогательный символ, обычно символ BEL ASCII
\bОтступ
\cОтключение вывода всех символов перевода строки в конце результата (только для параметров строк под контролем %b)
\fПеренос страницы (formfeed)
\nПеренос строки
\rВозврат каретки (Carriage return)
\tГоризонтальный табулятор
\vВертикальный табулятор
\\Лiteral обратный слеш
\dddПредставление символов восьмеричного значения от 1 до 3 знаков. Действительно только в строке формата
\0dddПредставление символов восьмеричного значения от 1 до 3 знаков
$ printf "a string, no processing:<%s>\n" "A\nB"
a string, no processing:<A\nB>
$ printf "a string, no processing:<%b>\n" "A\nB"
a string, no processing:<A
B>
$ printf "ru.oldtoolbag.com \a"
ru.oldtoolbag.com $                  #не переводить