Обычно при написании сценариев bash мы используем echo для вывода на стандартный вывод. echo — простая команда, но ее возможности ограничены.
Чтобы иметь больше контроля над форматированием вывода, используйте команду printf .
Команда printf форматирует и печатает свои аргументы, аналогично printf() в Си.
Содержание
Команда printf
printf — это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Также существует отдельный двоичный файл /usr/bin/printf , но встроенная версия оболочки имеет приоритет. Мы рассмотрим встроенную в Bash версию printf .
Синтаксис команды printf следующий:
printf [-v var] format [arguments]
Параметр -v указывает printf не печатать вывод, а назначать его переменной.
format представляет собой строку, которая может содержать три разных типа объектов:
- Обычные символы, которые просто выводятся как есть.
- Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
- Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.
Команда принимает любое количество arguments . Если указано больше arguments чем спецификаторов format строка 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 . Вот список наиболее распространенных escape-символов:
\— отображает обратную косую черту.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 , используйте флаг - ( %-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 принимает формат и аргументы и печатает отформатированный текст.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.