Por lo general, cuando escribimos 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 printf
comando.
El printf
El comando formatea e imprime sus argumentos, similar a C printf()
función.
printf
Comando #
printf
es un shell integrado en Bash y en otros shells populares como Zsh y Ksh. También hay un /usr/bin/printf
independiente binario, pero la versión integrada de shell tiene prioridad. Cubriremos la versión integrada de Bash de printf
.
La sintaxis para printf
El comando es el siguiente:
printf [-v var] format [arguments]
El -v
opción le dice a printf
no imprimir la salida sino asignarla a la 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 respectivos argumentos que siguen a la cadena de formato.
El comando acepta cualquier número de arguments
. Si hay más arguments
que se proporcionan especificadores de formato, el format
cadena se reutiliza para consumir todos los argumentos. Si hay menos arguments
que los especificadores de formato que se proporcionan, 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 a
printf
comando. - Al usar comillas simples
''
se conservará el valor literal de cada carácter encerrado entre 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
el 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 n.°
El specifier
de conversión de tipo 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
- 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 y%X
imprime en 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 en mayúsculas.%a
,%A
- Imprime el argumento como un número de coma flotante en notación fraccionaria hexadecimal.%a
imprime letras minúsculas y%A
imprime en mayúsculas.%g
,%G
- Imprima 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 dados.%g
imprime letras minúsculas y%G
imprime en mayúsculas.%c
- Imprime el argumento como un solo carácter.%f
- Imprime el argumento como un número de coma flotante.%s
- Imprime el argumento como una cadena.%%
- Imprime un%
literal 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 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.
Estos son los más comunes:
-
- Alinear a la izquierda el texto impreso dentro del campo. De forma predeterminada, el texto está alineado a la derecha.+
- Prefija los números con un+
o-
señales. 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.- espacio 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 #
El width
La 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 el -
indicador (%-20s
).
Mark 305
Cuando un asterisco (*
) se usa como un 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 la cantidad mínima 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 la cantidad 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 la cantidad máxima de caracteres que se imprimirán. Si el número de caracteres en el 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 punto 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
El comando toma un formato y argumentos e imprime un texto formateado.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.