Tutoriales

Tutorial de Bash Heredoc para principiantes

Al trabajar con scripts bash, puede haber ocasiones en las que necesite procesar una serie de entradas con el mismo comando. Afortunadamente, hay una forma en Bash de hacer esto. para lograr de manera más óptima HierDoc.

HereDoc, acrónimo de Aquí documento, es una entrada Reenvío -Método para pasar múltiples entradas a un programa o comando. El concepto de Heredoc no se trata solo de bash. Muchos lenguajes de programación populares como Perl, Ruby, PHP admiten heredoc.

En este artículo, echamos un vistazo a la sintaxis y el uso de Heredoc con algunos casos prácticos de uso. Todos los ejemplos de este artículo se han creado para que sean sencillos, de modo que incluso un principiante pueda comprender fácilmente el concepto. Entremos y juguemos en Bash con Heredoc.

Sintaxis de HereDoc

El siguiente diagrama ilustra la sintaxis de Heredoc.

Representación gráfica de la sintaxis HereDoc

Aquí,

  • mando – Cualquier comando (cat, wc, mail, etc.) que acepte redirecciones.
  • Operador de desvío (<<) – El operador estándar para HereDoc es <<. Reenvía el bloque de código al comando para su procesamiento.
  • Token separador – El separador marca el principio y el final del documento (bloque de código). El separador puede ser cualquier cosa, pero debería ser el mismo. Usualmente ves EOF se utiliza como separador, que significa «Fin del flujo de archivos».

Impresión de cadenas de varias líneas con HereDoc en Bash

Comencemos con un ejemplo simple de redirigir una cadena de varias líneas e imprimirla en la terminal.

los cat El comando acepta un flujo de entrada y usa Heredoc, y puede redirigir el bloque de código para imprimirlo en la terminal.

$ cat << EOF
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

Producción:

Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==

Eche un vistazo al fragmento de código de arriba. Tengo tres líneas que se redireccionan a eso. cat Mando. yo suelo EOF como separador. Sin embargo, puede usar cualquier cosa que desee, pero mantenga iguales los separadores de inicio y fin.

Probemos con otro ejemplo sencillo. Estoy dirigiendo el mismo redireccionamiento de tres líneas. El recuento de palabras Programa. Uso un separador diferente (BLK) Aquí.

$ wc -l << BLK
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
BLK

Salida de muestra:

3
Impresión de cadenas multilínea con heredoc

Reenvío y canalización en HereDoc

Puede combinar el operador de redirección de salida con Heredoc y redirigir la salida a un archivo en lugar de imprimirlo en la terminal.

Estoy usando el mismo ejemplo que usé en la sección anterior y redirigiendo la salida a un archivo llamado log_op.txt.

$ cat << EOF > /tmp/log_op.txt
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

La salida de Heredoc se puede enviar al archivo. ser enviado tubo Operador para su posterior procesamiento.

$ cat << EOF | grep -i sla
Something is wrong with the input file received for today.
Contact the downstream team to get it corrected.
==> SLA MISSED <==
EOF

Supresión de tabulaciones en HereDoc

Si su bloque de código contiene espacios (tabulaciones) y desea suprimirlos, use "-" después del operador de redireccionamiento. Un punto importante es que solo se suprimen las pestañas, no los espacios.

Eche un vistazo al siguiente ejemplo. Agregué una declaración condicional al mismo ejemplo que vimos en las secciones anteriores. Las dos primeras líneas en Heredoc están tabuladas (4) y la tercera línea está espaciada (2).

if [[ $x = "err" ]]
then
 cat <<- err_msg
     1. Something is wrong with the input file received for today.
     2. Contact the downstream team to get it corrected.
   3. ==> SLA MISSED <==
err_msg
fi

Cuando se envíe el fragmento de código, mi salida se verá así.

1. Something is wrong with the input file received for today.
2. Contact the downstream team to get it corrected.
   3. ==> SLA MISSED <==

Como puede ver, las tabulaciones se suprimen en la línea 1 y 2, pero no se suprimen en la línea 3 porque se utilizan espacios.

Variables y comandos en HereDoc

No es que solo pueda pasar cadenas dentro del bloque de código Heredoc. Puede pasar variables personalizadas y de entorno y ejecutar comandos dentro del bloque de código.

Eche un vistazo al siguiente ejemplo. Dentro del bloque de código tengo una variable personalizada "$AUTHOR", una variable de entorno "$SHELL", un comando externo "whoami".

Cuando se envía este fragmento, las variables y los comandos se expanden y luego se pasan al cat Mando.

AUTHOR="OSTechNix"

cat << EOF
Author: $AUTHOR                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Salida de muestra:

Author: OsTechnix
Article: Bash Heredoc
I am using the /bin/bash shell
karthick

Puede encerrar el separador inicial entre comillas simples para suprimir la expansión dentro del bloque de código. De esa manera, todo lo que esté dentro del bloque de código se trata como literal de cadena.

cat << 'EOF'
Author: $AUTHOR                  # USER DEFINED VARIABLE
Article: Bash Heredoc
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Salida de muestra:

Author: $AUTHOR            
Article: Bash Heredoc
I am using the $SHELL shell
$(whoami)

Como ya sabrá, Bash no admite comentarios de varias líneas. Con heredoc puede crear comentarios de varias líneas adjuntando el bloque de código al no-op Comando (:).

los no-op está integrado en Bash, que acepta la entrada y devuelve el código de salida cero. Puedes pensar en esto como un sinónimo de bash incorporado «cierto» que también deja el código de salida cero.

: << 'COMMENTS'
Author : OStechnix
Article : Bash Heredoc
BashV : 5.1.4
OS : PoP!_OS
COMMENTS

Aviso: Casi todos los editores de texto tienen la capacidad de seleccionar varias líneas y permiten comentar o descomentar con solo presionar un botón. Es mejor seguir con este enfoque.

Escape de caracteres especiales en HereDoc

Los bloques de código pueden contener caracteres especiales. Si desea escapar de los caracteres especiales, hay algunas formas de hacerlo.

Puedes incluir el separador individual o comillas o Prefijo de barra invertida con el separador. De esta forma, se escapan todos los caracteres especiales.

# SINGLE QUOTES ESCAPE
cat << 'EOF'
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF
# DOUBLE QUOTES ESCAPE
cat << "EOF"
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF
# BACKSLASH ESCAPE
cat << EOF
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

En lugar de enmascarar todos los caracteres especiales, también puede enmascarar ciertos caracteres especiales dentro del bloque con un. Agregar barra invertida antes de cada carácter especial.

cat << EOF
I am using the $SHELL shell      # ENV VARIABLE
$(whoami)                          # EXTERNAL COMMAND
EOF

Salida de muestra:

I am using the $SHELL shell      
karthick      

Caso de uso de HereDoc

Hasta ahora hemos visto la construcción central de Heredoc y sus usos básicos. Ahora veamos algunos casos de uso de la vida real. En mi experiencia, he usado Heredoc cuando trabajo con ssh y clientes de bases de datos donde necesito ejecutar un grupo de comandos.

Ejemplo 1: ejecutar como un usuario diferente dentro del script

En algunos casos, es posible que desee ejecutar ciertas partes de su código como un usuario diferente. En este caso, puede utilizar heredoc para redirigir los comandos para que se ejecuten bajo un usuario diferente.

Eche un vistazo al siguiente ejemplo. Estoy reenviando el bloque de código al su Comando que permite al usuario «Ostechnix» y crea un archivo llamado prueba si no existe.

su - ostechnix << EOF
if [[ ! -f /home/ostechnix/test ]];then
 touch /home/ostechnix/test
 echo "File Created"
else
 echo "File exists"
fi
EOF
HereDoc con otro usuario
HereDoc con otro usuario

Ejemplo 2: Utilice HereDoc con DB Client

Cuando necesita ejecutar una serie de comandos en una base de datos, Heredoc es útil.

Eche un vistazo al siguiente ejemplo. Estoy interactuando con el cliente MongoDB. mongosh y dentro de Heredoc, se pasan comandos de bloque de código para crear una nueva base de datos, colección y agregar un documento de muestra.

mongosh << EOF
use ostechnix
db.data.insertOne(
    "Site" : "OsTechnix",
    "DB"  : "Mongo"
)
db.data.find().pretty()
EOF
HereDoc con el cliente MongoDB
HereDoc con el cliente MongoDB

Puede que sepa o no sobre MongoDB, pero está bien. Esto es solo para mostrar cómo usar Heredoc para interactuar con clientes de base de datos. Puede usar cualquier cliente de base de datos como MySQL, psql, sqlite dependiendo de la base de datos con la que esté trabajando.

Ejemplo 3: ejecutar comandos remotos con HereDoc y SSH

Si desea ejecutar comandos a través del servidor remoto, puede usar heredoc en combinación con ssh Mando. Usualmente usa ssh Command le permite ejecutar comandos en el servidor remoto de la siguiente manera.

$ ssh [email protected] "command"

Deberá repetir el mismo comando una y otra vez para ejecutar comandos adicionales en el host remoto. Con heredoc puede agrupar y ejecutar todos los comandos.

$ ssh -T [email protected] << EOF
Command 1...
Command 2..
.....
Command N..
EOF

Si el mismo código debe ejecutarse en varios nodos, puede agregar for loop junto con Heredoc. Estoy usando el mismo fragmento de creación de archivos que vimos en el primer ejemplo.

  • La variable de matriz «servidor» contiene la lista de nombres de servidor.
  • El bucle for itera sobre la variable de matriz.
  • El comando para crear archivos se pasa al comando SSH, que itera en cada servidor y crea archivos. Asegúrate de agregar -T Indicador para el comando ssh, que desactiva la asignación de pseudo-terminal.
declare -a server=( host1 host2 host3 )
for host in $server[@]
do
  ssh -T [email protected]$host << EOF
  echo "Running at host - $host"
  if [[ ! -f /home/ostechnix/test ]];then
    touch /home/ostechnix/test
    echo "File Created"
  else
    echo "File exists"
  fi
EOF
done

diploma

Heredoc es un concepto importante para comprender y utilizar en scripts bash. Escribir muchos guiones te enseñará más sobre Heredoc y las formas de aprovecharlo al máximo.

Si nunca antes ha usado Heredoc, inicie la Terminal y pruebe todos los fragmentos de código del artículo para comprenderlo mejor.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba