Linux printf перенос строки

Обновлено: 05.07.2024

Если вы использовали оболочку Bash в течение приличного времени, вы, вероятно, знаете, как печатать строки в терминале Linux с помощью команды echo. Однако команда printf значительно упрощает печать текста с определенным форматированием.

Сегодня мы узнаем, как использовать функцию printf, чтобы улучшить наши навыки написания сценариев Bash.

Что такое функция printf в Bash?

Если вы знакомы с языками программирования C / C ++, возможно, вы уже знаете, как работает printf. Printf в оболочке Bash очень похож, но имеет несколько небольших отличий.

Как использовать printf в оболочке Bash

Базовый синтаксис printf:

Printf будет печатать строку формата при реализации экранированных символов ( ) и директив ( % ) с использованием указанных аргументов . Обратите внимание на вывод следующей команды:

Printf взял аргумент world и заменил им символ % s в указанной строке.

Вы можете заметить, что после вывода Bash не создает для вас новую строку. В отличие от команды echo, printf не предполагает, что вы хотите новую строку после печати вывода. Таким образом, вам нужно будет использовать символ новой строки n в каждом экземпляре.

Чтобы напечатать строку и перейти к новой строке, введите printf «Hello, world n» .

Важно помнить, что printf попытается повторно использовать формат для всех ваших аргументов. Вы можете использовать это в своих интересах, но если вы не будете осторожны, вы можете получить такие результаты:

Вы также должны знать, что если аргумент отсутствует, printf интерпретирует любые директивы как 0 (для числа) и null (для строки).

Теперь, когда вы знаете, как работает сценарий Bash с printf в Linux, вы готовы начать использовать его в своих командах.

Примеры printf в Linux Bash

Printf имеет множество спецификаторов формата, которые вы можете использовать в своих скриптах. Но сегодня мы рассмотрим только некоторые общие для функции.

1. Форматирование вывода с помощью строки

Чтобы отформатировать вывод строками текста, используйте директиву % s .

2. Форматирование выходной строки с помощью десятичных знаков.

Чтобы отформатировать строку с помощью целого числа, вы можете использовать директиву % d для десятичного знака со знаком.

Обратите внимание: если вы хотите использовать в выводе десятичное число без знака, вам придется вместо этого использовать директиву % u .

3. Вывод математических функций с помощью printf

Форматировать математические функции с помощью команды printf очень просто. Просто поместите свое выражение в двойные круглые скобки, как обычно в Bash, и укажите выражение в списке аргументов.

4. Форматирование шестнадцатеричных чисел.

Если вам нужно отформатировать шестнадцатеричное число, используйте % x для нижнего регистра и % X для верхнего регистра.

5. Печать даты и времени.

Чтобы напечатать текущую дату и время, вы можете объединить printf с командой date и передать следующие директивы.

Вы можете увидеть спецификаторы формата для месяца, дня, года, часа, минуты и секунды в вышеупомянутом выводе.

6. Форматирование строк с помощью символов Юникода.

Чтобы напечатать символы Unicode с помощью printf, используйте escape-символ u для 16-битного Unicode и U для 32-битного Unicode.

Например, вы можете распечатать символ авторского права с помощью следующей команды:

7. Добавьте интервал к выводу.

Вы можете форматировать свои строки с помощью пробелов, определив перед спецификатором директивы минимальное количество печатаемых символов. Неиспользуемые символы будут заполнены пробелами.

Например, при вводе printf "% s:% 5d n" "Value 1" 25 "Value 2" 120 будет выведено:

Спецификатор формата % 5d в выводе означает, что отформатированная строка будет содержать минимум пять символов. Поскольку 25 состоит только из двух цифр, к оставшимся символам добавляются пробелы.

Если вы передадите отрицательное число в качестве ширины, директива будет выровнена по левому краю, а не по правому краю.

Если вы хотите сделать ширину переменной, вы можете передать звездочку вместо числа, и printf будет использовать следующее число, которое найдет в списке аргументов.

Изучение команды printf в Linux

С помощью команды printf в поясе служебной программы сценариев Bash вы готовы приступить к печати сложных и разнообразных строк в своем терминале. При разработке сценариев Bash важно убедиться, что вы работаете в максимально производительной среде. Это не только улучшит ваши навыки работы с командной строкой, но и улучшит ваш рабочий процесс в целом.

В отличие от многих других команд, команда printf не используется для конвейеров (она не принимает стандартный ввод) и не находит частого применения непосредственно в командной строке (чаще всего используется в сценариях). Так почему так важна? Потому что printf так широко используется.

printf (от фразы «print formatted») изначально был разработан для языка программирования C и был реализован во многих языках программирования, включая оболочку. Фактически, в bash printf является встроенной командой.

printf работает так:

Команде даётся строка, содержащая описание формата, которое затем применяется к списку аргументов. Отформатированный результат отправляется на стандартный вывод. Вот банальный пример:

Строка формата может содержать буквальный текст (например, «Я отформатировал строку:»), escape-последовательности (например, \n, символ новой строки) и последовательности, начинающиеся с символа %, которые называются спецификациями преобразования. В приведённом выше примере спецификация преобразования %s используется для форматирования строки «аргумент» и помещения её в выходные данные команды. И снова:

Как мы видим, спецификация преобразования %s заменена строкой «аргумент» в выводе команды. Преобразование s используется для форматирования строковых данных. Есть и другие спецификаторы для других видов данных. В этой таблице перечислены наиболее часто используемые типы данных:

Общие спецификаторы типов данных printf

Спецификатор Описание
d Форматировать число как десятичное целое со знаком.
f Форматировать и вывести число с плавающей запятой.
o Форматировать целое число как восьмеричное число.
s Форматировать строку.
x Форматировать целое число как шестнадцатеричное, используя строчные буквы a-f, где необходимо.
X То же, что и x, но с прописными буквами.
e Научная нотация (экспоненциальная запись) в форме [-]d.ddde±dd, например, 1,233300e+04
E То же, что и e, но с прописной буквой E, например, 1,233300E+04.
% Вывести буквальный символ (т.е. укажите «%%»)

Мы продемонстрируем влияние каждого из спецификаторов преобразования на строку «380»:

Поскольку мы указали шесть спецификаторов преобразования, мы также должны предоставить шесть аргументов для обработки printf. Шесть результатов показывают влияние каждого спецификатора.

К спецификатору преобразования можно добавить несколько дополнительных компонентов, чтобы настроить его вывод. Полная спецификация преобразования может состоять из следующего:

При использовании нескольких необязательных компонентов они должны появляться в указанном выше порядке, чтобы их можно было правильно интерпретировать. Вот описание каждого из них:

Компоненты спецификации преобразования printf

Есть пять разных флагов:

0 – (ноль) означает заполнит вывод нулями. Это означает, что поле будет заполняться ведущими нулями, как в «000380».

- – (тире) означает выровнять вывод по левому краю. По умолчанию printf выравнивает выход по правому краю.

‘ ’ – (пробел) создаёт начальный пробел для положительных чисел.

+ – (знак плюса) добавит знак к положительным числам. По умолчанию printf пишет знак только для отрицательных исел.

Вот несколько примеров использования различных форматов:

Примеры спецификации преобразования printf

Опять же, printf используется в основном в сценариях, где он используется для форматирования табличных данных, а не непосредственно в командной строке. Но мы все ещё можем показать, как его можно использовать для решения различных проблем форматирования. Сначала давайте выведем несколько полей, разделённых символами табуляции:

Вставив \t (escape-последовательность для табуляции), мы достигаем желаемого эффекта. Далее несколько чисел с аккуратным форматированием:

Это показывает влияние минимальной ширины поля на расстояние между полями.

А как насчёт форматирования крошечной веб-страницы:


Если при использовании printf вы столкнулись с ошибкой «недопустимое число», например:

bash: printf: 3.14156295: недопустимое число

Если вы действительно указали правильное число, но получаете эту ошибку, то дело может быть в десятичной точке, а именно в используемом для неё символе.

Суть в том, что в разных странах в качестве десятичной точки используется либо точка, либо запятая. В компьютере принимаемый в качестве десятичной точки символ зависит от локали ОС. Если вы получили указанную ошибку, то просто попробуйте заменить точку в числе на запятую (или наоборот, запятую на точку), например, вместо числа 3.14156295 используйте чисто 3,14156295.

Favorite

Добавить в избранное

Главное меню » Linux » Команда printf. Оболочка Bash в Linux

Команда printf. Оболочка Bash в Linux

К ак правило, при написании сценариев bash мы используем echo для печати стандартный вывод. echo это простая команда, но ее возможности ограничены.
Чтобы лучше контролировать форматирование вывода, используйте команду printf.

Команда printf форматирует и печатает свои аргументы, аналогично функции printf() в C.

Команда printf

printf это оболочка, встроенная в Bash и другие популярные оболочки, такие как Zsh и Ksh. Существует также автономный двоичный файл /usr/bin/printf, но встроенная версия оболочки имеет преимущество. Мы рассмотрим встроенную версию Bash printf.

Синтаксис команды printf следующий:

  • Обычные символы, которые просто выводятся на печать как есть.
  • Символы с обратной косой чертой, которые интерпретируются и затем печатаются.
  • Спецификации преобразования, которые описывают формат и заменяются значениями соответствующих аргументов, следующих за строкой формата.

Ниже приведены несколько моментов, которые следует учитывать при передаче аргументов команде printf:

Типичный пример использования printf выглядит так:

Команда printf не добавляет символ новой строки ( \n) в конце строки.

Символы с обратной косой чертой

Символы с обратной косой чертой интерпретируются при использовании в строке формата или в аргументе, соответствующем спецификатору преобразования %b. Вот список наиболее распространенных escape-символов:

Конверсионные характеристики

Спецификация преобразования принимает следующую форму:

Каждая спецификация преобразования звезды с знаком процента (%), включает в себя дополнительные модификаторы и заканчивается одним из следующих букв, которые представляют собой тип данных (specifier) соответствующего аргумента: aAbcdeEfgGioqsuxX.

Спецификатор преобразования типа

Ниже приведен список, показывающий все преобразования типов и то, что они делают:

Число без знака представляет ноль и положительные числа, а число со знаком представляет отрицательные, ноль и положительные числа.

Следующая команда печатает число 100 в трех разных системах счисления:

Флаги директивы

Флаги являются первыми необязательными модификаторами и используются для установки выравнивания, начальных нулей, префиксов и т. д.

Вот самые распространенные из них:

Директива ширины

Указанная директива width помещается после любых символов флага и определяет минимальное количество символов, которое должно привести к преобразованию.

Если ширина выводимого текста меньше указанной ширины, он дополняется пробелами. Ширина может быть указана как неотрицательное десятичное целое число или звездочка ( *).

%20s означает установить поле длиной не менее 20 символов. Пробелы добавляются перед текстом, потому что по умолчанию вывод выровнен по правому краю. Чтобы выровнять текст по левому краю, используйте флаг (%-20s).

Когда звездочка ( *) используется в качестве директивы width, тогда ширина поля преобразования устанавливается аргументом ширины, который предшествует форматируемому аргументу.

В приведенном ниже примере мы устанавливаем ширину 10:

Директива точности

Модификатор .precision состоит из точки (.) с последующей положительным целым числом или звездочкой (*), которые в зависимости от типа спецификатора, задает число строк или цифровых символов или количество знаков после запятой для печати.

Точность имеет следующий эффект:

Вот пример, показывающий, как округлить число с плавающей запятой до 3 десятичных знаков:

Когда для точности задана звездочка ( *), ее значение задается аргументом точности, который предшествует форматируемому аргументу.

Вывод

Команда printf принимает формат и аргументы и печатает форматированный текст.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Эта команда была создана для замены всем знакомой команды echo. Возможности команды echo ограничены, кроме того, в разных ветках Unix'а оказались разные ее версии, что приводит к несовместимости. Поэтому Posix рекомендует пользоваться командой printf. Команда printf выводит АРГУМЕНТ на стандартный вывод (как правило, экран дисплея), используя при этом определенный ФОРМАТ.

Эта команда была создана для замены всем знакомой команды echo (настолько древней, что даже имя ее автора не известно).


Самое первое, что следует прояснить: по умолчанию команда printf не переводит строку по завершении. Это выглядит так:

Следующее приглашение командной строки находится на той же самой строке что и вывод предыдущей команды. Это очень неудобно, поэтому в ФОРМАТ приходится добавлять символ новой строки (\n):

Приглашение переехало на новую строку, и все обрело привычный вид. В дальнейшем я не стану приводить приглашение целиком, ограничусь знаком доллара.

Вот как выглядит команда printf в виде, полностью дублирующем команду echo:

Обратите внимание, что мы взяли аргумент в кавычки, чтобы получить его в виде одной строки. Если бы мы этого не сделали, то имели бы столбик, так как программа воспринимает выражения, разделенные пробелом, как множественные аргументы, и обрабатывает каждый в соответствии с заданным форматом:

Если нам нужно использовать команду printf для просмотра переменных окружения, то кавычки не нужны:

Если же мы возьмем аргумент в кавычки, то он будет воспринят просто как выражение и воспроизведен дословно:

Но довольно о замене команды echo, займемся непосредственно командой printf.

Описание и использование

Представление аргумента

N Нормальное десятичное число. Например 177

0N Восьмеричное число. Например 024.

0xN и 0XN Шестнадцатеричные числа. Например 0?41.

"А (обычные кавычки перед любой буквой) Интерпретируется как кодовый номер этой буквы в текущей кодировке. С кириллицей не работает.

'А (одинарные кавычки перед любой буквой) Интерпретируется как кодовый номер этой буквы в текущей кодировке. С кириллицей не работает.

Форматы команды printf

Вообще говоря, синтаксис команды printf взят от функции printf() языка программирования Си (и еще дюжины других). Но далеко не все знакомы с Си, поэтому мы внимательно рассмотрим все тонкости синтаксиса этой команды.

ФОРМАТ пишется в командной строке непосредственно после самой команды и заключается в кавычки - двойные или одинарные. Собственно говоря, кавычки нужны не всегда, но лучше их ставить, во избежание недоразумений. Это полезная привычка. (А ведь большинство привычек - вредные).

%b Рассматривает аргумент как строку, при этом интерпретирует все управляющие символы, содержащиеся в ней.

%s Рассматривает аргумент как просто как строку.

%c Рассматривает аргумент как символ, при этом берется первый символ выражения или строки.

%q Преобразует строку к виду, пригодному к использованию в качестве ввода в шелл.

Здесь необходимы пояснения. Допустим, мы хотим напечатать на экране фразу:

Для этого дадим следующую команду:

А теперь вместо формата %b применим формат %q:

Кажется, произошла какая-то ошибка или сбой. Но это не так; подставим вывод команды в качестве аргумента команды printf '%b\n', но уже безо всяких дополнительных кавычек (все необходимые кавычки содержатся в выводе команды):

Больше того, этот же вывод можно использовать в качестве аргумента для других команд, скажем echo -e (опция -e позволяет команде echo интерпретировать специальные символы, в частности символ новой строки (\n):

Вот какой интересный формат %q! Однако продолжим.

Дальше идут всевозможные форматы представления чисел.

%d Представляет аргумент в виде десятичного числа, могущего иметь знак (+ или -).

%u Представляет аргумент в виде десятичного числа, не имеющего знака.

%i То же, что и предыдущее.

%o Представляет аргумент в виде не имеющего знака восьмеричного числа.

%x Представляет аргумент в виде не имеющего знака шестнадцатеричного числа. Буквы пишутся в нижнем регистре.

%X Представляет аргумент в виде не имеющего знака шестнадцатеричного числа, при этом буквы пишутся в верхнем регистре.

%f Интерпретирует аргумент как число с плавающей запятой.

%e Интерпретирует аргумент с удвоенной точностью (double precision), при этом выводит его в формате <N>+/-e<N>.

%E То же, что и предыдущее, только с заглавной буквой Е.

Вот и все форматы, я привел их для встроенной в bash команды printf.

Модификаторы форматов

Для большей гибкости представления строк или чисел, поддерживаются несколько модификаторов форматов. Модификаторы вставляются между символом процента и буквой, характеризующей формат, например:


(С кириллицей не работает).

Модификаторы: Любое число Обозначает минимальную ширину колонки, если текст короче, то строки дополняются пробелами. (См. пример выше).

- Выравнивание текста по левому краю (стандарно - по правому краю)

0 Дополняет числа нулями, а не пробелами. Применяется при заданной ширине колонки (в примере 50). Пример:

space Дополняет положительные числа пробелами, а отрицательные знаками "минус" (-).

+ Пишет все числа со знаками плюс или минус.

Альтернативный формат для чисел

Точность разрешения

Точность разрешения чисел с плавающей запятой и чисел с удвоенной точностью (double precision) можно регулировать следующим образом:

Внимание: не прозевайте точку в записи формата!

Можно вместо числа знаков поставить астериск, тогда количество знаков ставится перед самим аргументом:

Для строк точность разрешения определяет максимальное число выводимых символов (максимальную ширину колонки текста).

Для целых чисел - задает число выводимых знаков (добавляет нули).

Управляющие символы языка Си, работающие с командой printf

\" Двойные кавычки

\NNN Символ с восьмеричным значением NNN (от 1 до 3 цифр)

\\ Обратный слэш (\)

\a Звуковой сигнал

\c Не производить дальнейшую обработку данных

\f Перевод страницы

\n Новая строка

\r Возврат каретки

\v Вертикальная табуляция

\xHH Символ с шестнадцатеричным кодом HH (1 или 2 цифры)

\uHHHH Символ Unicode (ISO/IEC 10646) с шестнадцатеричным кодом HHHH (4 цифры)

\UHHHHHHHH Символ Unicode с шестнадцатеричным кодом HHHHHHHH (8 цифр)

%% Символ %

Еще несколько примеров

1. Вывести шестнадцатеричное число в десятичной форме:

2. Вывести десятичное число в восьмеричной форме:

3. Узнать кодовый номер буквы А (англ):

4. Пример, служащий домашним заданием:

Кто понял, в чем тут дело, сообщите мне, пожалуйста. Я лично не понял.

Опции команды printf

Опция -v ПЕРЕМЕННАЯ_ОКРУЖЕНИЯ

Записывает аргумент в указанную переменную окружения. При этом затирает все, что там было прописано. Осторожно!


Хорошо, что в начале статьи я привел пример, в котором была записана моя $PATH, поэтому смог восстановить.

Опции --help и --version общеизвестны и рассмотрены не будут.

Примечание: В мане GNU-версии команды вы не найдете и половины этой информации, а будете отосланы к синтаксису языка Си.

Резюме команды printf

Исследуя подобные команды, получаешь настоящее удовольствие, маны практически отсутствуют, найденные статьи относятся к другим версиям команды. Почти все приходится добывать методом эксперимента. Сколько еще удивительных особенностей таит команда printf, узнают только те, кто станет пользоваться ей в повседневной жизни.

Должен предупредить, что собрал в этой статье все, что сумел "нарыть" по поводу всех версий этой команды. Поэтому некоторые варианты могут не срабатывать в ваших версиях.

Читайте также: