Самый простой способ печати из командной строки Linux – использовать команду echo.
echo "Value of var is $var"
Однако команда echo не подойдет, если вам нужно распечатать форматированный вывод.
Здесь вам поможет команда printf. Команда printf в bash работает как команда printf в языке программирования C/C ++.
printf "Моей собаки %s %d лет.\n" Бобик 9
Первый аргумент %sожидает строку, %dожидает десятичное целое число, как в C/C ++. Не волнуйтесь, если вы не знакомы с C/C ++.
Вам не нужно изучать его только для использования команды printf в ваших сценариях Bash. Позвольте мне показать вам несколько примеров команды printf в Bash.
Начнем сначала с синтаксиса.
printf format [arguments]
Здесь format- строка, которая определяет, как будут отображаться последующие значения.
В этом примере printf “Моей собаки %s %d лет.\n” Бобик 9, «Моей собаки %s %d лет. \n» – это формат, за которым следуют аргументы Бобик и 9. Аргументы используются для замены спецификаторов формата (% s,% d и т. д.), Которые мы объясним позже в этой статье.
В простейшей форме printf можно использовать как команду echo для отображения строки.
printf "Hello World\n"
Обратите внимание на символ новой строки \n в конце? Разница между командами echo и PRINTF является то, что echo автоматически добавляет символ новой строки в конце, но для Printf, вы должны явно добавить.
Имейте в виду, что строка формата пытается применяться ко всем аргументам. Поэтому на него стоит обратить особое внимание.
Maximus@andreyex:~$ printf "Привет, %s! \n" Maximus Бобик Привет, Maximus! Привет, Бобик!
Точно так же вы должны обратить внимание на тип спецификатора формата, который он ожидает в строке формата.
Как вы можете видеть в приведенном выше примере, если он не находит нужные аргументы, он отображает значения по умолчанию, которые равны нулю для строк и 0 для целых чисел.
printf "Привет %s, ваша будка номер %d. \n" Maximus Бобик 131 bash: printf: Бобик: invalid number Привет Maximus, ваша будка номер 0. Привет 131, ваша будка номер 0.
Здесь он принимает Maximus Бобик как первый набор аргументов, так и 131 второй набор аргументов.
Когда он находит строку (Бобик) вместо целого числа, он жалуется, но продолжает отображать вывод со вторым аргументом со значением по умолчанию 0.
Точно так же он видит 131 как строку во втором наборе аргументов, а поскольку второй аргумент отсутствует, по умолчанию он равен 0.
Для отображения вывода в желаемом формате доступно несколько спецификаторов формата. Вот некоторые из самых распространенных:
символ | Применение |
---|---|
%s | Строка |
%c | Одиночный персонаж |
%d | Целые числа |
%o | Восьмеричные целые числа |
%x | Шестнадцатеричные целые числа |
%f | Плавающая точка |
%b | Строка с escape-символом обратной косой черты |
%% | Знак процента |
Теперь, когда вы знакомы со спецификатором формата, давайте рассмотрим еще несколько примеров, демонстрирующих их в действии.
Мы не думаем, что вам нужно подробное объяснение большинства этих примеров, поскольку они не требуют пояснений.
Maximus@andreyex:~$ printf "Восьмеричное значение %d is %o\n" 30 30 Восьмеричное значение 30 is 36
Давайте посмотрим, как использовать спецификатор %b для правильной интерпретации экранированного символа обратной косой черты.
Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %s\n" "Hello\nWorld!" Строка с обратной косой чертой: Hello\nWorld!
Как видите %s, это не имеет значения. Но %b с новой строкой escape-символ будет правильно интерпретирован:
Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %b\n" "Hello\nWorld!" Строка с обратной косой чертой: Hello World!
Когда вы используете %c, он читает только символ за раз.
Maximus@andreyex:~$ printf "Символ: %c\n" a Символ: a Maximus@andreyex:~$ printf "Символ: %c\n" a b c Символ: a Символ: b Символ: c Maximus@andreyex:~$ printf "Символ: %c\n" abc Символ: a
Есть модификаторы, чтобы изменить внешний вид вывода по своему вкусу.
Ранее вы видели использование %oдля преобразования десятичного числа в восьмеричное. Однако было не совсем ясно, что это восьмеричное число. Вы можете использовать #модификатор для отображения восьмеричных и шестнадцатеричных чисел в правильном формате.
Maximus@andreyex:~$ printf "%d is %#o в восьмеричном и %#x в шестнадцатеричном формате\n" 30 30 30 30 is 036 в восьмеричном и 0x1e в шестнадцатеричном формате
Вы можете использовать пробел между %и d внутри %d для отображения положительного целого числа с начальным пробелом. Это помогает, когда у вас есть столбец положительных и отрицательных чисел. Посмотрите, какой из них выглядит более симпатичнее:
Maximus@andreyex:~$ printf "%d \n%d \n%d \n" 10 -10 10 10 -10 10 Maximus@andreyex:~$ printf "% d \n%d \n% d \n" 10 -10 10 10 -10 10
Модификатор ширины – это целое число, указывающее минимальную ширину поля аргумента.
По умолчанию он выровнен по правому краю:
Maximus@andreyex:~$ printf "%10s| %5d\n" Age 23 Age| 23
Вы можете выровнять его по левому краю, добавив -к нему флаг:
Maximus@andreyex:~$ printf "%-10s| %-5d\n" Age 23 Age | 23
Вы можете использовать прецизионный модификатор (.) Точки , чтобы определить минимальное количество цифр , которое будет отображаться с %d, %u, %o, %x. Он добавляет нулевое заполнение слева от значения.
Maximus@andreyex:~$ printf "Roll Number: %.5d\n" 23 Roll Number: 00023
Если вы используете модификатор точности со строкой, он указывает максимальную длину строки. Если строка длиннее, на дисплее она обрезается.
Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus Имя: Alex
Вы можете комбинировать модификатор ширины и точности:
Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus Имя: Alex Maximus@andreyex:~$ printf "Имя: %10.4s\n" Maximus Имя: Alex
Давайте применим то, что вы узнали о команде printf, на более сложном примере. Это продемонстрирует истинный потенциал команды printf в сценариях bash.
Давайте воспользуемся командой printf, чтобы распечатать следующую таблицу с помощью bash:
Имя | ID | Возраст | Оценки |
---|---|---|---|
Sherlock Holmes | 0000122 | 23 | A |
James Bond | 0000007 | 27 | F |
Hercules Poirot | 0006811 | 59 | G |
Jane Marple | 1234567 | 71 | C |
Вот сценарий оболочки, который мы написали для этой задачи. Ваш сценарий может отличаться:
#/bin/bash seperator=-------------------- seperator=$seperator$seperator rows="%-15s| %.7d| %3d| %c\n" TableWidth=37 printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades printf "%.${TableWidth}s\n" "$seperator" printf "$rows" "Sherlock Holmes" 122 23 A printf "$rows" "James Bond" 7 27 F printf "$rows" "Hercules Poirot" 6811 59 G printf "$rows" "Jane Marple" 1234567 71 C
Разве не чудесно использовать команду printf в bash для печати красиво отформатированного вывода для ваших сценариев?
Надеюсь, вам понравилось это подробное руководство по команде printf в Linux. Если у вас есть вопросы или предложения, дайте мне знать.