Как правило, при написании сценариев bash мы используем echo для печати стандартный вывод. echo это простая команда, но ее возможности ограничены.
Чтобы лучше контролировать форматирование вывода, используйте команду printf.
Команда printf форматирует и печатает свои аргументы, аналогично функции printf() в C.
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 "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34 Closed issues: 65
Строка Open issues: %s\nClosed issues: %s\n — это format, «34» и «65» являются аргументами. Строка формата содержит два символа новой строки (\n) и два спецификатора формата (%s), которые заменяются аргументами.
Команда printf не добавляет символ новой строки ( \n) в конце строки.
Символы с обратной косой чертой интерпретируются при использовании в строке формата или в аргументе, соответствующем спецификатору преобразования %b. Вот список наиболее распространенных escape-символов:
Спецификация преобразования принимает следующую форму:
%[flags][width][.precision]specifier
Каждая спецификация преобразования звезды с знаком процента (%), включает в себя дополнительные модификаторы и заканчивается одним из следующих букв, которые представляют собой тип данных (specifier) соответствующего аргумента: aAbcdeEfgGioqsuxX.
Преобразование типа specifier — это символ, который определяет, как интерпретировать соответствующий аргумент. Этот символ обязателен, и он помещается после необязательных полей.
Ниже приведен список, показывающий все преобразования типов и то, что они делают:
Число без знака представляет ноль и положительные числа, а число со знаком представляет отрицательные, ноль и положительные числа.
Следующая команда печатает число 100 в трех разных системах счисления:
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100 Hex: 64 Octal: 144
Флаги являются первыми необязательными модификаторами и используются для установки выравнивания, начальных нулей, префиксов и т. д.
Вот самые распространенные из них:
Указанная директива width помещается после любых символов флага и определяет минимальное количество символов, которое должно привести к преобразованию.
Если ширина выводимого текста меньше указанной ширины, он дополняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *).
Вот пример:
printf "%20s %d\n" Mark 305
%20s означает установить поле длиной не менее 20 символов. Пробелы добавляются перед текстом, потому что по умолчанию вывод выровнен по правому краю. Чтобы выровнять текст по левому краю, используйте флаг (%-20s).
Mark 305
Когда звездочка ( *) используется в качестве директивы width, тогда ширина поля преобразования устанавливается аргументом ширины, который предшествует форматируемому аргументу.
В приведенном ниже примере мы устанавливаем ширину 10:
printf "%0*d" 10 5
0 — это флаг, который дополняет число начальными нулями вместо пробелов. Выходной текст будет содержать не менее 10 символов:
0000000005
Модификатор .precision состоит из точки (.) с последующей положительным целым числом или звездочкой (*), которые в зависимости от типа спецификатора, задает число строк или цифровых символов или количество знаков после запятой для печати.
Точность имеет следующий эффект:
Вот пример, показывающий, как округлить число с плавающей запятой до 3 десятичных знаков:
printf "%.3f" 1.61803398
1.618
Когда для точности задана звездочка ( *), ее значение задается аргументом точности, который предшествует форматируемому аргументу.
printf "%.*f" 3 1.61803398
1.618
Команда printf принимает формат и аргументы и печатает форматированный текст.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.