Короче говоря, printf %100s
напечатает 100 пробелов и tr " " "="
преобразует эти пробелы в знаки равенства, эффективно печатая 100 знаков равенства.
Разбивая это:
printf
это встроенная оболочка Обычно требуется два или более аргумента, первый из которых является «строкой формата», а остальные будут использоваться для заполнения заполнителей в этой строке формата. Как только этот шаблон будет полностью заполнен, он распечатает результат. Если осталось больше аргументов, он начнется заново, заполняя больше аргументов и печатая полученную строку.
Строка формата, используемая для, printf
принимает спецификации формата, которые начинаются %
и заканчиваются одной буквой, поэтому %d
означает целое число (с использованием десятичной основы, следовательно, «d»), %f
означает число с плавающей запятой и %s
означает строку символов. Символы, отличные от букв после, %
являются модификаторами для спецификации формата, и, в частности, цифры используются для указания запрошенной длины поля на выходе. Таким образом %100s
, строка будет иметь формат не менее 100 символов, заполнит ее пробелами и выровнит ее по правому краю (другими словами, добавит пробелы в начале строки).
Если передан дополнительный аргумент, он будет использовать его для этого %s
поля, поэтому, например printf %100s abc
, напечатает 97 пробелов (чтобы получить общее число 100, учитывая 3 в «abc»), за которыми следует фактическая строка «abc». Но если аргумент не указан, то спецификация формата заполняется пустым или нулевым аргументом (для которого пустая строка, для %s
0 будет 0 %d
и т. Д.). То же самое, как если бы была передана пустая строка, например: printf %100s ''
, Конечным результатом является то, что печатается только заполнение из 100 символов.
Таким образом, все это printf %100s
приводит к печати 100 пробелов.
Теперь tr
это инструмент для перевода символов из ввода в вывод. Он принимает два аргумента, SET1 и SET2, каждый набор символов, а затем переводит первый символ SET1 в первый из SET2, второй символ SET1 во второй из SET2 и так далее. tr
читает входные данные из stdin и записывает их обратно в stdout (так что это очень полезно в конвейерах, подобных приведенному выше.) tr
всегда переводит все вхождения этого символа в данную строку.
Например, tr aeiou 12345
будет переводить строчные гласные в числа от 1 до 5 в этом порядке, поэтому он будет переводить «очередь» в «q52523ng», например. Вы также можете передать ему диапазон символов, например, tr a-z A-Z
чтобы превратить любую строчную букву в соответствующую заглавную.
Так tr " " "="
же просто переводить пробелы в знаки равенства по всей строке. Первое место должно быть заключено в кавычки, чтобы быть признанным в качестве аргумента. На =
самом деле не нужно цитировать, но это не повредит. tr " " =
работал бы так же.
Собрав все воедино, выведите 100 пробелов, а затем переведите каждый из них в знаки равенства.
Надеюсь, это объясняет это достаточно подробно, но если есть что-то, чего вы не понимаете, пожалуйста, оставьте комментарий, и я постараюсь ответить на него.
printf '%100s' ' ' | tr " " "="