Короче говоря, printf %100sнапечатает 100 пробелов и tr " " "="преобразует эти пробелы в знаки равенства, эффективно печатая 100 знаков равенства.
Разбивая это:
printfэто встроенная оболочка Обычно требуется два или более аргумента, первый из которых является «строкой формата», а остальные будут использоваться для заполнения заполнителей в этой строке формата. Как только этот шаблон будет полностью заполнен, он распечатает результат. Если осталось больше аргументов, он начнется заново, заполняя больше аргументов и печатая полученную строку.
Строка формата, используемая для, printfпринимает спецификации формата, которые начинаются %и заканчиваются одной буквой, поэтому %dозначает целое число (с использованием десятичной основы, следовательно, «d»), %fозначает число с плавающей запятой и %sозначает строку символов. Символы, отличные от букв после, %являются модификаторами для спецификации формата, и, в частности, цифры используются для указания запрошенной длины поля на выходе. Таким образом %100s, строка будет иметь формат не менее 100 символов, заполнит ее пробелами и выровнит ее по правому краю (другими словами, добавит пробелы в начале строки).
Если передан дополнительный аргумент, он будет использовать его для этого %sполя, поэтому, например printf %100s abc, напечатает 97 пробелов (чтобы получить общее число 100, учитывая 3 в «abc»), за которыми следует фактическая строка «abc». Но если аргумент не указан, то спецификация формата заполняется пустым или нулевым аргументом (для которого пустая строка, для %s0 будет 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 " " "="