Tabla de contenidos
ToggleIntroducción
El comando Bash printf le brinda más flexibilidad y opciones de formato que el comando echo al escribir en una ventana de terminal de Linux. Incluso las peculiaridades de printf pueden ser beneficiosas.
Es uno de los aspectos más fundamentales de trabajar con software. Lees lo que la aplicación ha escrito en la pantalla. Incluso con el hábito derivado de Unix y compatible con Linux de que los programas de línea de comandos sean lo más breves posible, muchas aplicaciones solo escriben en la terminal cuando algo sale mal. Un básico de programación crucial es informar al usuario de lo que está ocurriendo, va a suceder o ha ocurrido recientemente.
El comando echo en el shell Bash puede escribir texto en la pantalla del terminal. Puede usarlo en secuencias de comandos o en la línea de comandos, y puede manejar variables y mostrar sus valores si están contenidos en la cadena. Entonces, ¿cuál es el punto de printf? ¿No es la escritura de texto algo de lo que se encarga el eco? Printf, por otro lado, brinda más que solo la capacidad de escribir cadenas en las ventanas de la terminal. Le brinda mucha versatilidad cuando se trata de formatear la salida, y tiene algunos trucos adicionales bajo la manga.
El comando printf en Bash es similar a la función printf en C, sin embargo, hay varios cambios. Deberá estar al tanto de los cambios si está familiarizado con C.
Creación de cadenas simples
Veamos las diferencias entre echo y printf cuando se trata de escribir cadenas en la terminal.
eco aquí hay algunas palabras
printf aquí hay algunas palabras
Mientras echo imprime todas las palabras, printf simplemente publica la primera. Además, printf no imprime una nueva línea. La salida es justo en el medio del símbolo del sistema. Pero antes que nada, se deben citar todas las palabras para que printf actúe sobre ellas.
eco aquí hay algunas palabras
printf "aquí hay algunas palabras"
Eso es un paso adelante. Hemos impreso todas las palabras, pero todavía estamos esperando una nueva línea. Esto se debe a que printf solo imprime una nueva línea si la solicita específicamente. Esto puede sonar inconveniente, pero le permite elegir si agregar o no uno. Debe agregar "n" en su cadena para que printf emita una nueva línea. Aquí se utiliza la secuencia de escape "nueva línea".
eco aquí hay algunas palabras
printf "aquí hay algunas palabras"
Usará una nueva línea algunas veces y otras no. En este ejemplo, un comando printf utiliza una nueva línea mientras que el otro no.
printf "Cómo hacer" && printf "Geekn"
Debido a que el primer printf no imprime una nueva línea, la salida del segundo printf se coloca en la misma línea que "Cómo hacer". Para imprimir una nueva línea, el segundo printf usa n. El símbolo del sistema ahora se mostrará en la línea debajo del texto impreso.
Personajes que han eludido la captura
Aquí hay algunos caracteres adicionales que pueden usarse como escapes. Ya has visto cómo funciona "n".
n: Cambia a una nueva línea.
r: Este comando imprime un retorno de carro. El cursor de salida vuelve al principio de la línea actual.
t: este comando imprime un carácter de tabulación.
v: agrega un espacio de tabulación vertical a la página.
\: Se imprime un carácter de barra invertida.
“: Muestra una comilla.
b: Muestra el carácter de retroceso.
El carácter de escape de retorno de carro se utiliza para devolver el cursor al principio de la línea actual.
printf "La miel es la raíz de todos los malesrDinero"
El comando printf lee de izquierda a derecha. Hasta que printf detecta el carácter de escape "r", la cadena se escribe como texto normal. El cursor de salida se reposiciona al principio de la línea actual.
Con la letra inmediatamente debajo del carácter “r”, continúa el procesamiento de la cadena. El resto hace que printf imprima "Dinero", que reemplaza la frase "Cariño".
El carácter de barra invertida "" señala secuencias de escape, mientras que las comillas """ se utilizan para citar cadenas. Si desea imprimir estos caracteres, use una barra invertida para escaparlos. Esto le indica a printf que deben tratarse como caracteres literales.
printf "Esto es una tTab, esto es una comilla ", y esto \ es una barra invertida"
Variables en Acción
El uso de variables con printf es bastante similar al uso de variables con echo. Para incluir una variable, como esta variable de entorno, use el signo de dólar "$" como de costumbre antes.
printf "Directorio de inicio: $HOMEn"
Formato de cadena
Las cadenas de formato son cadenas que especifican el formato de salida. Usted proporciona el texto de la cadena de formato y los valores adicionales para trabajar como argumentos.
El texto, las secuencias de escape y los especificadores de formato pueden incluirse en la cadena de formato.
Los especificadores de formato de Printf le informan qué tipo de argumento debe aceptar, como cadenas, números o caracteres.
Los especificadores de formato más frecuentes se muestran a continuación. Un símbolo de porcentaje “por ciento” los precede a todos. Puede imprimir un signo de porcentaje combinando dos signos de porcentaje "por ciento por ciento".
- %s: Imprime una cadena.
- %c: Imprime un solo carácter.
- %d: Imprime un número entero.
- %f: imprime un número de punto flotante.
- %u: Imprime un entero sin signo.
- 1TP2A: Imprime un valor en octal.
- %x: Imprime un valor enhexadecimal, en minúsculas.
- %X: Imprime un valor en hexadecimal, en mayúsculas.
- %e: Imprime un número de coma flotante en notación científica, en minúsculas.
- %E: Imprime un número de coma flotante en notación científica, en mayúsculas.
- %%: Imprime un símbolo de porcentaje “%”.
printf "Cómo hacer %sn" "Geek"
printf "%s%s %sn" "Cómo" "-Para" "Geek"
La cadena de formato del primer comando contiene algo de contenido propio. La cadena "Geek" se envía a printf como argumento. El especificador de formato “%s” lo compara y lo imprime. Entre la cadena de formato y la cadena de argumento, solo hay un espacio. En C, se requeriría una coma para separarlos, pero con la versión Bash de printf, un espacio es suficiente.
Solo los especificadores de formato y la secuencia de escape de nueva línea se incluyen en la segunda cadena de formato. Cada uno de los especificadores de formato "%s" consume los tres parámetros de cadena a su vez. Nuevamente, en C, se requiere una coma entre cada parámetro, pero la función printf de Bash nos permite ignorar este requisito.
Simplemente use el especificador de formato adecuado para generar varios tipos de argumentos. Aquí hay una función simple de conversión de números basada en printf. En notación decimal, octal y hexadecimal, imprimiremos el número 15.
printf "diciembre: %dnOct: %onHex: %xn" 15 15 15
Vamos a reducirlo un poco para que el ejemplo esté menos recargado.
printf "Hexadecimal: %xn" 15
La mayoría de nosotros estamos acostumbrados a ver números hexadecimales representados en mayúsculas y con valores inferiores a 0x10 precedidos por un cero inicial. Podemos hacer esto colocando un especificador de ancho entre el signo de porcentaje "%" y el carácter "X" y utilizando el especificador de formato hexadecimal en mayúsculas "% X".
Esto especifica el tamaño del campo en el que se debe imprimir el argumento para printf. Se han añadido espacios al campo. Los números de dos dígitos se presentarían sin relleno en este estilo.
printf "Hexadecimal: %2Xn" 15
Ahora tenemos un valor en mayúsculas con un espacio inicial escrito en él. Al colocar un cero delante de los dos, podemos hacer que printf complete el campo con ceros en lugar de espacios:
printf "Hex: %02Xn" 15
El especificador de precisión le permite especificar cuántos puntos decimales deben incluirse en la salida.
printf "Floating point: %08.3fn" 9.243546
Esto hace que la creación de tablas de resultados con resultados perfectamente alineados sea muy sencilla. Este comando también muestra otra de las idiosincrasias de Bash printf. Si hay más argumentos que especificadores de formato, los argumentos se introducen en la cadena de formato en lotes hasta que se agotan. La cantidad de especificadores de formato en la cadena de formato determina el tamaño del lote que se procesa en un momento dado. Los argumentos adicionales enviados a la función printf en C se ignoran.
printf "Flotante: %8.3fn" 9.243546 23.665 8.0021
Las cadenas también pueden emplear los especificadores de ancho y precisión. Las cadenas se imprimen en un campo de 10 caracteres de ancho usando este comando.
printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3
De forma predeterminada, los valores se justifican a la derecha en sus campos. Para justificarlos a la izquierda, use un signo menos "-
” inmediatamente detrás del porcentaje “%
" firmar.
printf "%-10s %d" "abrigos" 7 "zapatos" 22 "Paraguas" 3
El especificador de precisión le permite elegir el número máximo de caracteres que se imprimirán. Los dos puntos “:” se utilizan para indicar las limitaciones del ancho del campo. No en la forma en que se abrevia el término "paraguas".
printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "abrigos" "zapatos" "Paraguas"
Incluso como argumento, se puede usar el especificador de ancho. En lugar de un especificador numérico, use un asterisco "*" y proporcione el ancho como una entrada de número entero.
printf "%*sn" 20 "Más a la derecha" 12 "Medio" 5 "más a la izquierda"
Otras rarezas y trucos
Los especificadores de formato en la cadena de formato operarán con valores del tipo adecuado, ya sea que se proporcionen como argumentos ordinarios en la línea de comando o se creen como resultado de una expresión.
Esto muestra el resultado de sumar dos números:
imprimir "23+32=%dn" $((23+32))
El número de carpetas en el directorio de trabajo actual se imprime con este comando:
printf "Hay %d directoriosn" $(ls -d */ | wc -l)
El comando printf imprime una cadena que fue devuelta desde otro programa.
printf "Usuario actual: %sn" $(whoami)
Si el especificador de formato de cadena "porcentaje s" no se proporciona con un argumento, printf devuelve nulo.
printf "Uno: %s dos: %sn" "Alfa"
Si se da un valor numérico por accidente para el especificador de formato de cadena "% s", lo imprime como una cadena y no se queja. Si hace esto usando C printf, terminará con muchos problemas. Es casi seguro que su software fallará. A Bash printf, por otro lado, no parece importarle.
printf "Uno: %s dos: %sn" "Alfa" 777
Si el especificador de formato entero "% d" no recibe un argumento, se imprime cero.
printf "Entero: %dn"
Bash generará un mensaje de error y printf imprimirá cero si el especificador de formato entero "% d" recibe una cadena de entrada por accidente.
printf "Entero: %dn" "Siete"
Se pueden crear símbolos incómodos ingresando su número Unicode, también conocido como "punto de código". La letra "u" se usa para escapar de ciertos caracteres, seguida de su valor Unicode.
printf "El símbolo del euro: u20ACn"
Para acomodar las secuencias de escape en las cadenas de argumentos, utilice el especificador de formato "% b" en lugar del especificador de formato de cadena "% s" en la cadena de formato.
imprimir "%s" "u20ACn"
imprimir "%b" "u20ACn"
El comando printf inicial no reconoce la secuencia de escape de nueva línea y no procesa el valor Unicode. El especificador de formato "% b" se usa en el segundo comando printf. El carácter Unicode se maneja adecuadamente y se muestra una nueva línea.
Caballos de carreras
Es posible que solo necesite repetir algún texto en la ventana del terminal de vez en cuando. Sin embargo, printf es la herramienta ideal para la tarea cuando necesita aplicar algo de posicionamiento y formato.
printf "%b" "Tha-" "tha-" "tha-" "eso es todo amigos.n"