Por lo general, cuando escribimos scripts de bash, usamos echopara imprimir en la salida estándar.  es un comando simple pero tiene capacidades limitadas.echo

Para tener más control sobre el formato de la salida, use el printfcomando.

El printfcomando formatea e imprime sus argumentos, similar a la printf()función C.

printfMando

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

La sintaxis del printfcomando es la siguiente:

printf [-v var] format [arguments]

La -vopción le dice printfque no imprima la salida sino que la asigne a la variable.

es una cadena formatque 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 respectivos argumentos que siguen a la cadena de formato.

El comando acepta cualquier número de arguments. Si argumentsse proporcionan más de especificadores de formato, la formatcadena se reutiliza para consumir todos los argumentos. Si argumentsse proporcionan menos de especificadores de formato, los especificadores de formato numérico adicionales se establecen en valor cero, mientras que los especificadores de formato de cadena se establecen en cadena nula.

A continuación hay algunos puntos a considerar al pasar argumentos al printfcomando:

  • El shell sustituirá todas las variables, coincidencias de comodines y caracteres especiales antes de pasar los argumentos al printfcomando.
  • Al utilizar comillas simples '', se conservará el valor literal de cada carácter encerrado entre las comillas. Las variables y los comandos no se expandirán.
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
Closed issues: 65

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

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

Caracteres con barra invertida escapada

Los caracteres de escape con barra invertida se interpretan cuando se usan en la cadena de formato o en un argumento correspondiente a un %bespecificador de conversión. Aquí hay 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 toma la siguiente forma:

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

Cada especificación de conversión comienza con el 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.

Especificador de conversión de tipo

La conversión de tipo specifieres 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 todas las conversiones de tipo y lo que hacen:

  • %b - Imprima el argumento mientras expande las secuencias de escape de barra invertida.
  • %q - Imprime el argumento entre comillas, 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. %ximprime letras minúsculas e %Ximprime mayúsculas.
  • %e, %E- Imprime el argumento como un número de punto flotante en notación exponencial. %eimprime letras minúsculas e %Eimprime mayúsculas.
  • %a, %A- Imprime el argumento como un número de coma flotante en notación fraccionaria hexadecimal. %aimprime letras minúsculas e %Aimprime mayúsculas.
  • %g, %G- Imprime el argumento como un número de coma flotante en notación normal o exponencial, según sea más apropiado para el valor y la precisión proporcionados. %gimprime letras minúsculas e %Gimprime 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.
  • %%- Imprimir un %símbolo literal.

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 numéricos diferentes:

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

directiva de banderas

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

Aquí están los más comunes:

  • -- Alinear a la izquierda el texto impreso dentro del campo. De forma predeterminada, el texto se alinea a la derecha.
  • +- Prefije los números con un signo +o . -De forma predeterminada, solo los números negativos tienen el prefijo de un signo negativo.
  • 0- Rellena los números con ceros a la izquierda en lugar de espacios.
  • en blanco : prefije los números positivos con un espacio en blanco y los números negativos con un signo menos ( -).
  • #- Un formato alternativo para los números.

Directiva de ancho

La widthdirectiva archivada se coloca después de cualquier carácter indicador y especifica el número mínimo de caracteres que debe generar la conversión.

Si el ancho del texto de salida 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

%20ssignifica establecer el campo de al menos 20 caracteres de longitud. Se agregan espacios en blanco antes del texto porque, de manera predeterminada, la salida se justifica a la derecha. Para alinear el texto a la izquierda, use la -bandera ( %-20s).

      Mark 305

Cuando se usa un asterisco ( *) como widthdirectiva, el ancho del campo de conversión se establece mediante un argumento de ancho que precede al argumento que se está formateando.

En el siguiente ejemplo, estamos configurando el ancho en 10:

printf "%0*d" 10 5

0es una bandera que rellena 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 .precisionmodificador consta de un punto ( .) seguido de un entero positivo o un asterisco ( *) que, según el tipo de especificador, establece el número de caracteres de cadena o dígito o el número de lugares decimales que se imprimirán.

La precisión tiene el siguiente efecto:

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

Aquí hay un ejemplo que muestra cómo redondear un número de coma flotante a 3 decimales:

printf "%.3f" 1.61803398
1.618

Cuando la precisión se establece en un asterisco ( *), su valor lo establece el argumento de precisión que precede al argumento que se está formateando.

printf "%.*f" 3 1.61803398
1.618

Conclusión

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

Si tiene alguna pregunta o comentario, no dude en dejar un comentario.