GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Scripting - Comando Printf explicado con ejemplos

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

Linux
  1. Tutorial de Bash HereDoc con ejemplos

  2. Comando de corte de Linux explicado con 6 ejemplos

  3. Comando de apagado de Linux explicado con ejemplos

  4. Comando Traceroute de Linux, explicado con ejemplos

  5. '&&' vs. '&' con el comando 'test' en Bash

Bash Scripting:matriz indexada explicada con ejemplos

Comando Tr en Linux explicado con ejemplos

w Comando explicado con ejemplos en Linux

Bash Scripting Part2 – Bucles for y while con ejemplos

Explicación del comando tee de Linux (con ejemplos)

Explicación del comando csplit de Linux (con ejemplos)