Cómo imprimir la salida en Bash con el comando printf en Linux

1 mar 2021 5 min di lettura
Cómo imprimir la salida en Bash con el comando printf en Linux
Indice dei contenuti

Introducción

Normalmente, al escribir scripts bash, usamos echo para imprimir en la salida estándar. echo es un comando simple pero tiene capacidades limitadas. Para tener más control sobre el formato de la salida, use el comando printf

El printf formatea e imprime sus argumentos, similar a la printf().

Comando printf

printf es un shell integrado en Bash y otros shells populares como Zsh y Ksh. También hay un archivo binario independiente /usr/bin/printf, pero la versión incorporada del shell tiene prioridad. Cubriremos la versión Bash integrada de printf.

La sintaxis del printf es la siguiente:

printf [-v var] format [arguments]

La -v permite que el printf no imprima la salida sino que la asigne a una variable.

El format es una cadena que puede contener tres tipos diferentes de objetos:

  • Caracteres normales que simplemente se imprimen en la salida tal cual.
  • Caracteres con barra invertida que se interpretan y luego se imprimen.
  • Especificaciones de conversión que describen el formato y se reemplazan por los valores de los argumentos respectivos después de la cadena de formato.

El comando acepta cualquier número de arguments. Si se proporcionan arguments format se reutiliza para todos los arguments. Si se proporcionan arguments format, los formatos de números adicionales se establecen en cero, mientras que los formatos de cadenas adicionales se establecen en una cadena nula.

Aquí hay algunos puntos a considerar al pasar argumentos al comando printf

  • El shell sustituirá todas las variables, comodines y caracteres especiales antes de pasar argumentos al comando printf
  • Cuando se utilizan comillas simples '' el valor literal de cada carácter entre comillas. Las variables y los comandos no se expandirán.

Un ejemplo típico de uso de printf ve así:

printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
 Closed issues: 65

La cadena Open issues: %s\nClosed issues: %s\n es el format mientras que "34" y "65" son arguments. La cadena de formato contiene dos caracteres de nueva línea ( \n ) y dos especificadores de formato ( %s ) que se reemplazan con argumentos.

El printf no agrega un carácter de nueva línea ( \n ) al final de la línea.

Caracteres de escape con barra invertida

Los caracteres de escape de barra invertida se interpretan cuando se utilizan en la cadena de formato o en un argumento correspondiente a un identificador de conversión %b A continuación, se muestra una lista de los caracteres de escape más comunes:

  • \\: muestra un carácter de barra invertida.
  • \b: muestra un carácter de retroceso.
  • \n: muestra una nueva línea.
  • \r: muestra un retorno de carro.
  • \t: muestra una pestaña horizontal.
  • \v: muestra una pestaña vertical.

Especificaciones de conversión

Una especificación de conversión tiene la siguiente forma:

%[flags][width][.precision]specifier

Cada especificación de conversión comienza con un signo de porcentaje ( % ), incluye modificadores opcionales y termina con una de las siguientes letras que representan el tipo de datos ( specifier ) del argumento correspondiente: aAbcdeEfgGioqsuxX.

Tipos de identificadores de conversión

La conversión del specifier es un carácter que especifica cómo interpretar el argumento correspondiente. Este carácter es obligatorio y se coloca después de los campos opcionales.

A continuación, se muestra una lista que muestra todos los tipos de conversiones y lo que hacen:

  • %b: se imprime el argumento mientras se expanden las secuencias de escape de barra invertida.
  • %q: imprime el argumento citado del shell, reutilizable como entrada.
  • %d, %i: imprime el argumento como un entero decimal con signo.
  • %u: imprime el argumento como un entero decimal sin signo.
  • %o: imprime el argumento como un entero octal sin signo.
  • %x, %X: imprime el argumento como un entero hexadecimal sin signo. %x imprime letras minúsculas y %X imprime mayúsculas.
  • %e, %E: imprime el argumento como un número de punto flotante en notación exponencial. %e imprime letras minúsculas y %E imprime mayúsculas.
  • %a, %A: imprime el argumento como un número de punto flotante en notación fraccionaria hexadecimal. %a imprime letras minúsculas y %A imprime mayúsculas.
  • %g, %G: imprime el argumento como un número de punto flotante en notación normal o exponencial, lo que sea más apropiado para el valor y la precisión dados. %g imprime letras minúsculas y %G imprime mayúsculas.
  • %c: imprime el argumento como un solo carácter.
  • %f: imprime el argumento como un número de punto flotante.
  • %s: imprime el argumento como una cadena.
  • %%: imprime un símbolo %

Un número sin signo representa cero y números positivos, mientras que un número con signo representa números negativos, cero y positivos.

El siguiente comando imprime el número 100 en tres sistemas de numeración diferentes:

printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
 Hex: 64
 Octal: 144

Directivas sobre banderas

Las banderas son primeros modificadores opcionales y se utilizan para establecer justificación, ceros iniciales, prefijos, etc.

Éstos son los más comunes:

  • - - Izquierda alinea el texto impreso dentro del campo. De forma predeterminada, el texto está alineado a la derecha.
  • + - Números de prefijo con un signo + o - De forma predeterminada, solo los números negativos están precedidos por un signo negativo.
  • 0: teclado numérico con ceros a la izquierda en lugar de espacio.
  • vacío - Prefijar números positivos con un espacio en blanco y números negativos con un signo menos ( - ).
  • #: Formato alternativo para números.

Directiva de ancho

La width se coloca después de cualquier indicador y especifica el número mínimo de caracteres que deberían resultar en la conversión.

Si el ancho de la salida de texto es menor que el ancho especificado, se rellena con espacios. El ancho se puede especificar como un entero decimal no negativo o un asterisco ( * ).

Aquí hay un ejemplo:

printf "%20s %d\n" Mark 305

%20s significa establecer el campo al menos 20 caracteres. Los espacios se agregan antes del texto porque, de forma predeterminada, la salida está justificada a la derecha. Para alinear el texto a la izquierda, use la - ( %-20s ).

 Mark 305

Cuando se utiliza un asterisco ( * width, el ancho del campo de conversión se establece mediante un argumento de ancho que precede al argumento formateado.

En el siguiente ejemplo, establecemos el ancho en 10:

printf "%0*d" 10 5

0 es una bandera que llena el número con ceros a la izquierda en lugar de espacios en blanco. El texto de salida tendrá al menos 10 caracteres:

0000000005

Directiva de precisión

El .precision consta de un punto ( . ) Seguido de un número entero positivo o un asterisco ( * ) que, según el tipo de especificador, establece el número de caracteres de cadena o dígitos o el número de dígitos decimales a imprimir.

.precision tiene el siguiente efecto:

  • Si el tipo de conversión es un número entero, la precision especifica el número mínimo de dígitos para imprimir. Si el número de dígitos del argumento es menor que la precision, se imprimen ceros a la izquierda.
  • Si el tipo de conversión es punto flotante, la precision especifica el número de dígitos que siguen al carácter del punto decimal. La precision predeterminada es 6.
  • Si el tipo de conversión es una cadena, la precision especifica el número máximo de caracteres para imprimir. Si el número de caracteres en el argumento es mayor que la precision, los caracteres sobrantes se truncan.

A continuación, se muestra un ejemplo que muestra cómo redondear un número de coma flotante a 3 lugares decimales:

printf "%.3f" 1.61803398
1.618

Cuando la precision se establece en un asterisco ( * ), su valor lo establece el precision que precede al argumento que se formatea.

printf "%.*f" 3 1.61803398
1.618

Conclusión

El printf toma un formato y argumentos e imprime un texto formateado.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.