En bref, printf %100s
imprimera 100 espaces et tr " " "="
convertira ces espaces en signes égaux, imprimant efficacement 100 signes égaux.
Décomposer:
printf
est un shell intégré. Il prend généralement deux arguments ou plus, le premier étant une "chaîne de format" et le reste sera utilisé pour remplir des espaces réservés dans cette chaîne de format. Une fois ce modèle entièrement rempli, il imprimera le résultat. S'il reste plus d'arguments, il recommencera, remplissant plus d'arguments et imprimant la chaîne résultante.
La chaîne de format utilisée pour printf
prend les spécifications de format, qui commencent %
et se terminent par une seule lettre, donc %d
signifie un entier (en utilisant la base décimale, donc "d"), %f
signifie un nombre à virgule flottante et %s
signifie une chaîne de caractères. Les caractères autres que les lettres après le %
sont des modificateurs de la spécification de format et, en particulier, des nombres sont utilisés pour spécifier la longueur demandée du champ en sortie. Donc %100s
, formatera la chaîne pour avoir au moins 100 caractères, il la remplira d'espaces et la gardera alignée à droite (en d'autres termes, ajoutez des espaces au début de la chaîne.)
Si un argument supplémentaire est passé, il l'utilisera pour ce %s
champ, donc par exemple, printf %100s abc
affichera 97 espaces (pour atteindre 100 au total, en considérant les 3 dans "abc") suivi de la chaîne réelle "abc". Mais si aucun argument n'est donné, la spécification de format est remplie avec un argument vide ou nul (qui est une chaîne vide pour %s
, ce serait 0 pour %d
, etc.) C'est donc la même chose que si une chaîne vide était passée, comme printf %100s ''
. Le résultat final est que seul le remplissage de 100 caractères est imprimé.
Donc, en rassemblant le tout, vous printf %100s
obtenez 100 espaces imprimés.
Maintenant, tr
c'est un outil pour traduire les caractères de l'entrée à la sortie. Il prend deux arguments, SET1 et SET2, chacun un ensemble de caractères, puis traduit le premier caractère de SET1 en premier de SET2, le deuxième caractère de SET1 en deuxième de SET2 et ainsi de suite. tr
lit son entrée depuis stdin et l'écrit sur stdout (il est donc très utile dans des pipelines comme celui ci-dessus.) tr
traduira toujours toutes les occurrences de ce caractère dans une chaîne donnée.
Par exemple, tr aeiou 12345
traduira les voyelles minuscules dans les nombres 1 à 5 dans cet ordre, donc il traduira "file d'attente" en "q52523ng" par exemple. Vous pouvez également lui transmettre des plages de caractères, de manière tr a-z A-Z
à transformer n'importe quelle lettre minuscule en lettre majuscule correspondante.
Il en tr " " "="
va de même pour la traduction des espaces en signes égaux tout au long de la chaîne. Le premier espace doit être cité pour être reconnu comme argument. Le =
n'a pas besoin d'être cité, mais cela ne fait pas de mal. tr " " =
aurait fonctionné de la même manière.
En rassemblant le tout, imprimez 100 espaces, puis traduisez chacun d'eux en signes égaux.
J'espère que cela l'explique suffisamment en détail, mais s'il y a encore quelque chose que vous ne comprenez pas, veuillez laisser un commentaire et je vais essayer de répondre à cela.
printf '%100s' ' ' | tr " " "="