
Обычно при написании bash-скриптов мы используем echo для вывода в стандартный вывод. echo — простая команда, но ее возможности ограничены.
Чтобы лучше контролировать форматирование вывода, используйте команду printf .
Команда printf форматирует и печатает свои аргументы, аналогично функции C printf() .
Команда printf
printf — встроенная функция оболочки Bash и других популярных оболочек, таких как Zsh и Ksh. Существует также отдельный исполняемый файл /usr/bin/printf , но встроенная в оболочку версия имеет приоритет. Мы рассмотрим встроенную в Bash версию printf .
Синтаксис команды printf следующий:
printf [ -v var ] format [ arguments ]
Опция -v указывает printf не выводить вывод, а присвоить его переменной.
format представляет собой строку, которая может содержать три различных типа объектов:
- Обычные символы, которые просто выводятся на печать как есть.
- Символы, экранированные обратной косой чертой, интерпретируются и затем выводятся на экран.
- Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.
Команда принимает любое количество arguments . Если число arguments превышает число спецификаторов формата, строка format используется повторно для всех аргументов. Если число arguments меньше числа спецификаторов формата, дополнительные спецификаторы числового формата устанавливаются равными нулю, а спецификаторы строкового формата — равными пустой строке.
Ниже приведены несколько моментов, которые следует учитывать при передаче аргументов команде printf :
- Оболочка заменит все переменные, подстановочные знаки и специальные символы перед передачей аргументов команде
printf. - При использовании одинарных кавычек
''значение каждого символа, заключённого в кавычки, сохраняется. Переменные и команды не раскрываются.
Типичный пример использования printf выглядит так:
printf "Open issues: %snClosed issues: %sn" "34" "65"
Open issues: 34 Closed issues: 65
Строка Open issues: %snClosed issues: %sn — это format , а «34» и «65» — аргументы. Строка формата содержит два символа новой строки ( n ) и два спецификатора формата ( %s ), которые заменяются аргументами.
Команда printf не добавляет символ новой строки ( n ) в конец строки.
Символы, экранированные обратной косой чертой
Символы, экранированные обратной косой чертой, интерпретируются при использовании в строке формата или в аргументе, соответствующем спецификатору преобразования %b . Ниже представлен список наиболее распространённых экранированных символов:
-
\— Отображает символ обратной косой черты. -
b— Отображает символ возврата на одну позицию. -
n— Отображает новую строку. -
r— Отображает возврат каретки. -
t— Отображает горизонтальную вкладку. -
v— Отображает вертикальную вкладку.
Характеристики преобразования
Спецификация преобразования имеет следующую форму:
%[flags][width][.precision]specifier
Каждая спецификация преобразования начинается со знака процента ( % ), включает необязательные модификаторы и заканчивается одной из следующих букв, которые представляют тип данных ( specifier ) соответствующего аргумента: aAbcdeEfgGioqsuxX .
Спецификатор преобразования типов
specifier преобразования типа — это символ, который определяет, как интерпретировать соответствующий аргумент. Этот символ является обязательным и размещается после необязательных полей.
Ниже приведен список всех преобразований типов и их функций:
-
%b— вывести аргумент, расширяя escape-последовательности с обратной косой чертой. -
%q— вывести аргумент, заключенный в кавычки, который можно использовать повторно в качестве входных данных. -
%d,%i— вывести аргумент как знаковое десятичное целое число. -
%u— вывести аргумент как беззнаковое десятичное целое число. -
%o— вывести аргумент как беззнаковое восьмеричное целое число. -
%x,%X— вывести аргумент как беззнаковое шестнадцатеричное целое число.%xвыводит строчные буквы, а%X— заглавные. -
%e,%E— вывести аргумент как число с плавающей запятой в экспоненциальной нотации.%eвыводит строчные буквы, а%E— заглавные. -
%a,%A— вывести аргумент как число с плавающей запятой в шестнадцатеричной дробной системе счисления.%aпечатает строчные буквы, а%A— заглавные. -
%g,%G— вывести аргумент как число с плавающей запятой в обычной или экспоненциальной форме, в зависимости от того, какой формат больше подходит для заданного значения и точности.%gпечатает строчные буквы, а%G— заглавные. -
%c— вывести аргумент как один символ. -
%f— вывести аргумент как число с плавающей запятой. -
%s— вывести аргумент в виде строки. -
%%— Вывести буквальный символ%.
Беззнаковое число представляет ноль и положительные числа, тогда как знаковое число представляет отрицательные, ноль и положительные числа.
Следующая команда выводит число 100 в трех различных системах счисления:
printf "Decimal: %dnHex: %xnOctal: %on" 100 100 100
Decimal: 100 Hex: 64 Octal: 144
Флаги директивы
Флаги — это первые необязательные модификаторы, которые используются для установки выравнивания, начальных нулей, префиксов и т. д.
Вот наиболее распространённые из них:
-
-Выравнивание печатаемого текста в поле по левому краю. По умолчанию текст выравнивается по правому краю. -
+— Добавляйте к числам знаки «+или-. По умолчанию знак «-» добавляется только к отрицательным числам. -
0— дополняет числа начальными нулями, а не пробелами. - пустой
— Положительные числа следует записывать с пробелом, а отрицательные — со знаком минус (-). -
#— Альтернативный формат чисел.
Директива ширины
Поле директивы width размещается после любых символов-флагов и указывает минимальное количество символов, которое должно получиться в результате преобразования.
Если ширина выводимого текста меньше заданной, она дополняется пробелами. Ширина может быть задана как неотрицательное десятичное целое число или как звёздочка ( * ).
Вот пример:
printf "%20s %dn" Mark 305
%20s означает, что длина поля должна быть не менее 20 символов. Пробелы добавляются перед текстом, поскольку по умолчанию вывод выравнивается по правому краю. Чтобы выровнять текст по левому краю, используйте флаг - ( %-20s ).
Mark 305
Если в качестве директивы width используется звездочка ( * ), то ширина поля преобразования задается аргументом ширины, который предшествует форматируемому аргументу.
В примере ниже мы устанавливаем ширину 10:
printf "%0*d" 10 5
0 — это флаг, который дополняет число ведущими нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:
0000000005
Директива точности
Модификатор .precision состоит из точки ( . ), за которой следует положительное целое число или звездочка ( * ), которые в зависимости от типа спецификатора задают количество строковых или цифровых символов или количество десятичных знаков, которые должны быть напечатаны.
Точность имеет следующий эффект:
- Если тип преобразования — целое число, точность определяет минимальное количество выводимых цифр. Если количество цифр в аргументе меньше точности, выводятся начальные нули.
- Если тип преобразования — число с плавающей запятой, точность определяет количество цифр после десятичной точки. Точность по умолчанию — 6.
- Если тип преобразования — строка, точность определяет максимальное количество символов, которые нужно вывести. Если количество символов в аргументе превышает точность, лишние символы отсекаются.
Вот пример, показывающий, как округлить число с плавающей запятой до трех знаков после запятой:
printf "%.3f" 1.61803398
1.618
Если точность установлена в виде звездочки ( * ), ее значение задается аргументом точности, который предшествует форматируемому аргументу.
printf "%.*f" 3 1.61803398
1.618
Заключение
Команда printf принимает формат и аргументы и печатает форматированный текст.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства