En este artículo, voy a explicar el uso básico del Bash printf Comando con ejemplos en Linux. Al final de este artículo, se sentirá cómodo usando el comando printf en las secuencias de comandos de shell de Bash.
Comando bash printf
Golpe ofrece dos tipos de comandos que se pueden usar para imprimir su salida en la terminal. Uno es el eco comando que se utiliza principalmente para este propósito. El segundo es el printf comando.
Printf
es similar a la función printf en C lenguaje pero con su propio conjunto de características. La principal diferencia entre echo
y printf
el comando es que printf
ofrece formato y funcionalidades adicionales en comparación con el echo
dominio.
Si no has usado el echo
comando anterior, tenemos un artículo detallado al respecto que debe consultar.
- Comando Bash Echo explicado con ejemplos en Linux
Printf
es un shell integrado, pero también puede encontrar un comando externo para printf
. Builtin tiene prioridad sobre el comando externo. Puede obtener esta información ejecutando el type
comando como se muestra a continuación.
$ type -a printf printf is a shell builtin printf is /usr/bin/printf printf is /bin/printf
Para más detalles sobre type
comando, consulte la siguiente guía:
- Tutorial de comandos de tipo con ejemplos para principiantes
Si desea ejecutar la versión externa de printf
, debe señalar la ruta completa del directorio donde reside el binario.
$ printf "Hello World\n" # SHELL BUILTIN
$ /usr/bin/printf "Hello World\n" # EXTERNAL VERSION OF PRINTF
Mostrar la ayuda de Bash printf
Como mencioné en la sección anterior, printf
es bash incorporado. Tienes que abrir el bash
página del manual y vaya a printf
sección.
$ man bash
/printf → presss
También puede ejecutar el siguiente comando que mostrará la sección de ayuda de printf
desde el bash
página man.
$ man bash | less --pattern='^ *printf +['
Forma básica del comando printf
A lo largo de los ejemplos, compararé el printf
con echo
comando para entender la comunidad.
A continuación se muestra el formato para el printf
comando:
printf [-v var] format [arguments]
Los argumentos deben pasarse a printf
de lo contrario, fallará como se muestra en la imagen de abajo.
$ printf
$ echo $?
Pase un argumento y ejecute printf
comando de nuevo. En el siguiente ejemplo, puede ver que he agregado \n, que es el carácter de nueva línea. Por defecto, printf
no agregará una nueva línea como echo
comando, por lo que debe agregar \n
.
$ printf "Linux is fun to work with" # WITHOUT NEW LINE
$ printf "Linux is fun to work with\n" # WITH NEW LINE
Interpretación de variables y comandos
Puede encerrar cualquier variable o ejecutar comandos dentro del printf
declaración. Este comportamiento es similar al echo
comando.
$ VAR1="Linux"
$ printf "$VAR1 is fun to work with\n"
Lectura sugerida:
- Secuencias de comandos de Bash:variables explicadas con ejemplos
Comportamiento entre comillas simples y dobles
Cuando encierra sus argumentos entre comillas simples, la variable y el comando se tratarán como texto sin formato. Este es el mismo comportamiento en echo
mando también. Debe encerrar los argumentos entre comillas dobles si desea expandir la variable y el comando.
$ printf '$VAR1 is fun to work with\n'
$ printf 'Today date = $(date)\n'
Cuando pasa argumentos sin comillas, printf
considerará solo la primera palabra como argumento y la imprimirá. Entonces, usando comillas alrededor de printf
es necesario.
$ printf Today date = $(date)\n
Redireccionar y canalizar la salida
Por defecto, printf
enviará las salidas a stdout (terminal). Puede redirigir la salida a un archivo usando el operador de redirección o combínalo con el operador de tubería para su posterior procesamiento.
# PRINT TO STDOUT $ printf "Today date = $(date)\n"
# REDIRECT TO A FILE $ printf "Today date = $(date)\n" > /tmp/tdy.txt $ cat /tmp/tdy.txt
# PIPE $ printf "Today date = $(date)\n" | grep -i -o IST
Lectura relacionada:
- Redireccionamiento de Bash explicado con ejemplos
Asignar salida a una variable
A veces es posible que desee almacenar el printf
salida a una variable y usarla más tarde para algún procesamiento. Normalmente ejecutará el printf
encerrado entre corchetes que ejecutará el comando y asignará la salida a una variable.
$ ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
$ printf $ZONE
Alternativamente, puede usar -v
marca junto con printf
para almacenar la salida en una variable. Tienes que pasar el nombre de la variable después de -v
bandera.
$ printf -v TIME "Today date = $(date)\n" $ echo $TIME
Instrucción printf multilínea
Cuando tenga más de una línea para imprimir, puede encerrar el texto entre comillas dobles. De manera similar, si tiene una línea enorme para imprimir como una sola línea y desea escribir la línea en varias líneas para una mejor legibilidad del código, puede usar una barra invertida al final de cada línea donde la siguiente línea se considerará como una continuación de la línea anterior.
$ printf "\n I am running PoP_OS
It is a great OS
With Great features\n"
$ printf "I am running pop_os \
It is a great OS \
With Great features\n"
Caracteres con barra invertida escapados
Puede usar los siguientes caracteres con barra diagonal inversa en printf
.
- Carácter de nueva línea (\n)
- Pestaña horizontal (\t) y pestaña vertical (\v)
- Carácter de retroceso (\b)
- Retorno de carro (\r)
Analicemos uno por uno con ejemplos.
Carácter de nueva línea (\n)
Ya hemos visto sobre el carácter de nueva línea (\n
) en todas las secciones anteriores. Carácter de nueva línea (\n
) agregará una nueva línea.
$ printf "Today date = $(date)\n"
Pestaña horizontal (\t) y pestaña vertical (\v)
Los caracteres de tabulación horizontales y verticales se utilizan para agregar espacios de tabulación a su printf
argumentos.
$ printf "Today date \t $(date)\n" # HORIZONTAL TAB
$ printf "Today date \v $(date)\n" # VERTICAL TAB
Carácter de retroceso (\b)
Carácter de retroceso (\b
) eliminará una letra. Esto es como presionar la tecla Retroceso de nuestro teclado.
$ printf "It's a rain\by day..\n"
Retorno de carro (\r)
El cursor vuelve a la primera posición cuando el retorno de carro (\r
) se utiliza. Lo que venga después de \r
reemplazará los caracteres de la primera posición.
$ printf "It's a rain\by\r day..\n"
Carácter de barra invertida de escape (\)
Si desea escapar de los caracteres especiales (\n
, \t
, \v
, \b
, \r
) y trátelo como una cadena y luego prefijelo con barras invertidas dobles (\\
).
$ printf "It's a rain\\by\\r day..\n"
Independientemente de lo que haya visto hasta ahora, puede encontrar el mismo conjunto de operaciones en el echo
mando también. Si ya conoces el echo
comando, en este momento se habrá sentido muy cómodo con el printf
comando también.
Especificadores de formato de Printf
Los especificadores de formato son una forma de sustituir el valor en printf
en lugar de codificar el valor en printf
. Hay muchas letras que se utilizan para la sustitución y cada letra representa un tipo de datos en particular. Al usar un especificador, debe prefijarlo con un %
símbolo. Veamos algunos de los especificadores de formato comúnmente utilizados.
Especificador de cadena (%s)
Si desea colocar cadenas dentro de printf
, tienes que usar %s
. Eche un vistazo al siguiente ejemplo. Tengo un printf
declaración y quiero sustituir el valor "United" dentro del printf
. Entonces %s
se usa, que es un especificador de cadena y cuando ejecuta el comando, el valor "united" será sustituido en lugar de %s
.
$ printf "++ Manchester %s has a strong lineup this season" "United"
Puede pasar tantos argumentos de sustitución como desee y debe usar la misma cantidad de especificadores dentro del argumento.
$ printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"
¿Qué pasa si se usan menos especificadores y más argumentos?
Eche un vistazo al siguiente ejemplo. He usado solo un especificador al principio y he pasado tres argumentos (cadenas) para ser sustituidos. La forma printf
trata esto es, comenzará a sustituir el primer argumento en el primer especificador y el siguiente argumento se pasará nuevamente al primer especificador ya que no hay otros especificadores. De esta manera habrá tres sustituciones que en realidad no son correctas y el resultado que queremos.
$ printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"
Hay algunos casos de uso en los que este comportamiento tiene sentido. Eche un vistazo al siguiente ejemplo. Deseo imprimir un mensaje de bienvenida para algunos jugadores y pasar sus nombres como argumentos. Normalmente puede almacenar la lista de nombres en una matriz y recorrer la matriz e imprimir el mensaje. Pero esta es una forma efectiva de lograr el resultado al evitar el uso de bucles.
$ printf "++ Welcome %s to manchester united\n" "Ronaldo" "Varane" "Jadon Sancho\n" ++ Welcome Ronaldo to manchester united ++ Welcome Varane to manchester united ++ Welcome Jadon Sancho to manchester united
Entero decimal con signo (%d) y Entero decimal sin signo (%u)
Para sustituir números enteros chamuscados, use %d
.
$ printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25
Para sustituir números enteros sin signo, use %u
.
$ printf "UNSIGNED INTEGER = %u\n" 10
Si intenta sustituir cualquier tipo de datos que no sea un número entero, obtendrá un error.
$ printf ">> Ronaldo gets no %d\n" seven
Número de coma flotante (%f)
Para sustituir números de coma flotante, use %f
.
$ printf "Integer 100 to floating-point %f\n" 100
Interpretación de la secuencia de escape de barra invertida
Puede pasar secuencias de escape de barra invertida como argumentos y usar %b
que interpretará y expandirá la secuencia de escape de barra invertida.
$ printf "Welcome to %b Manchester united %b" "\v" "\n"
Directivas de conversión de Printf
Hay modificadores de conversión opcionales que se pueden usar para formatear su printf
salidas.
%[flags][width][.precision]specifier
Modificador de ancho
El modificador de ancho decide el número mínimo de caracteres en la conversión. Si el número de caracteres es menor, los espacios se antepondrán como se muestra a continuación.
$ printf "%10s\n" "Ronaldo"
Si observa la imagen de arriba, el especificador (Ronaldo) es 7 caracteres y he especificado que el ancho sea 10 . En este caso, agregará espacios para justificar el ancho 10 .
También puede usar modificadores de bandera para justificar la alineación o agregar ceros en lugar de espacios. Por ejemplo, si la salida debe alinearse a la izquierda, puede agregar un guión (-
) modificador de bandera.
$ printf "%-10s\n" "Ronaldo"
En el caso de valores enteros y de punto flotante, puede reemplazar el espacio con ceros agregando un modificador de bandera cero (0).
$ printf "%010d \n" 7
Modificador de precisión
Este es un parámetro opcional que se puede usar para decidir el número de cadenas, enteros y posiciones de punto flotante que se imprimirán. Tienes que usar punto(.) seguido del número entero para decidir el número de posiciones que se imprimirán.
Eche un vistazo al siguiente ejemplo. Estoy usando un especificador de cadena y configuro el modificador de precisión en cuatro.
$ printf "%.7s\n" "Ronaldo has joined Manu"
Asteriscos (*
) se puede pasar en lugar de valores enteros de precisión. Los asteriscos aceptarán argumentos de precisión en lugar de codificar el valor de precisión.
$ printf "%.*s\n" 7 "Ronaldo has joined Manu"
Conclusión
Hemos cubierto bastante información sobre el comando Bash printf en este artículo. Para usar el printf
cómodamente, simplemente practique todos los ejemplos dados en el artículo. Printf es mucho más potente en formato que los ejemplos que he mostrado en este artículo. Si se siente cómodo con los conceptos básicos, dependiendo del caso de uso, puede usar printf
eficientemente.
Lectura relacionada:
- Bash Scripting:matriz indexada explicada con ejemplos
- Secuencias de comandos de Bash:matriz asociativa explicada con ejemplos
- Secuencias de comandos de Bash:ciclo while y till explicado con ejemplos
- Secuencias de comandos de Bash:bucle For explicado con ejemplos
- Bash Scripting:funciones explicadas con ejemplos
- Tutorial de Bash Heredoc para principiantes