En resumen, printf %100s
imprimirá 100 espacios y tr " " "="
los convertirá en signos iguales, imprimiendo efectivamente 100 signos iguales.
Desglosándolo:
printf
Es un shell incorporado. Por lo general, se necesitan dos o más argumentos, el primero de los cuales es una "cadena de formato" y el resto se usará para completar los marcadores de posición en esa cadena de formato. Una vez que la plantilla esté completamente llena, imprimirá el resultado. Si quedan más argumentos, comenzará de nuevo, llenando más argumentos e imprimiendo la cadena resultante.
La cadena de formato utilizada para printf
toma especificaciones de formato, que comienzan %
y terminan con una sola letra, por lo que %d
significa un número entero (usando la base decimal, por lo tanto, "d"), %f
significa un número de coma flotante y %s
significa una cadena de caracteres. Los caracteres que no son letras después de ellos %
son modificadores para la especificación de formato y, en particular, los números se utilizan para especificar la longitud solicitada del campo en la salida. Entonces %100s
formateará la cadena para que tenga al menos 100 caracteres, la rellenará con espacios y la mantendrá alineada a la derecha (en otras palabras, agregará espacios al comienzo de la cadena).
Si se pasa un argumento adicional, lo usaría para ese %s
campo, por lo que , por ejemplo printf %100s abc
, imprimirá 97 espacios (para llegar a 100 en total, considerando el 3 en "abc") seguido de la cadena real "abc". Pero si no se proporciona ningún argumento, la especificación de formato se rellena con un argumento vacío o nulo (que es una cadena vacía para %s
, sería 0 para %d
, etc.) Entonces, eso es lo mismo que si se pasara una cadena vacía, como printf %100s ''
. El resultado final es que solo se imprime el relleno de 100 caracteres.
Entonces, al unirlo todo, se printf %100s
imprimen 100 espacios.
Ahora tr
es una herramienta para traducir caracteres de entrada a salida. Toma dos argumentos, SET1 y SET2, cada uno un conjunto de caracteres, y luego traduce el primer carácter de SET1 en el primero de SET2, el segundo carácter de SET1 en el segundo de SET2 y así sucesivamente. tr
lee su entrada de stdin y la vuelve a escribir en stdout (por lo que es muy útil en canalizaciones como la anterior). tr
Siempre traducirá todas las apariciones de ese carácter en una cadena dada.
Por ejemplo, tr aeiou 12345
traducirá las vocales en minúsculas en los números del 1 al 5 en ese orden, por lo que traducirá "hacer cola" en "q52523ng", por ejemplo. También puede pasarle rangos de caracteres, como tr a-z A-Z
convertir cualquier letra minúscula en su correspondiente mayúscula.
Entonces, tr " " "="
simplemente está traduciendo espacios en signos iguales a lo largo de la cadena. El primer espacio necesita ser citado para ser reconocido como un argumento. En =
realidad, no es necesario citarlo, pero hacerlo no hace daño. tr " " =
hubiera funcionado igual.
Poniendo todo junto, imprime 100 espacios, luego traduce cada uno de ellos en signos iguales.
Esperemos que esto lo explique con suficiente detalle, pero si todavía hay algo que no comprende, deje un comentario e intentaré solucionarlo.
printf '%100s' ' ' | tr " " "="