Por lo general, cuando escribimos scripts de bash, usamos echo
para 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 printf
comando.
El printf
comando formatea e imprime sus argumentos, similar a la printf()
función C.
printf
Mando
printf
es un shell integrado en Bash y en otros shells populares como Zsh y Ksh. También hay un /usr/bin/printf
binario independiente, pero la versión integrada de shell tiene prioridad. Cubriremos la versión integrada de Bash de printf
.
La sintaxis del printf
comando es la siguiente:
printf [-v var] format [arguments]
La -v
opción le dice printf
que no imprima la salida sino que la asigne a la variable.
es una cadena format
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 respectivos argumentos que siguen a la cadena de formato.
El comando acepta cualquier número de arguments
. Si arguments
se proporcionan más de especificadores de formato, la format
cadena se reutiliza para consumir todos los argumentos. Si arguments
se 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 printf
comando:
- El shell sustituirá todas las variables, coincidencias de comodines y caracteres especiales antes de pasar los argumentos al
printf
comando. - 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\n
es el format
mientras 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 printf
comando 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 %b
especificador 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 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 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.%x
imprime letras minúsculas e%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 e%E
imprime mayúsculas.%a
,%A
- Imprime el argumento como un número de coma flotante en notación fraccionaria hexadecimal.%a
imprime letras minúsculas e%A
imprime 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.%g
imprime letras minúsculas e%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.%%
- 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 width
directiva 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
%20s
significa 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 width
directiva, 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
0
es 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 .precision
modificador 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 printf
comando toma un formato y argumentos e imprime un texto formateado.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.
0 Comentarios