Cómo utilizar Heredoc en secuencias de comandos de Shell


Aquí, el documento (Heredoc) es un literal de flujo de entrada o archivo que se trata como un bloque especial de código. Este bloque de código se pasará a un comando para su procesamiento. Heredoc se origina en shells de UNIX y se puede encontrar en shells de Linux populares como sh, tcsh, ksh, bash, zsh, csh. En particular, otros lenguajes de programación como Perl, Ruby, PHP también admiten heredoc.

Estructura de Herdoc

Heredoc usa 2 corchetes angulares (<<) seguidos de un token delimitador. Se utilizará el mismo token delimitador para terminar el bloque de código. Todo lo que esté dentro del delimitador se considera un bloque de código.

Mira el ejemplo de abajo. Estoy redirigiendo el bloque de código al comando cat. Aquí, el delimitador se establece en "BLOQUE" y termina con el mismo "BLOQUE".

cat << BLOCK
	Hello world
	Today date is $(date +%F)
	My home directory = ${HOME}
BLOCK

NOTA: Debe usar el mismo token delimitador para iniciar el bloque y terminarlo.

Crear comentarios de varias líneas

Si está codificando en algún momento en bash ahora, es posible que sepa que, de forma predeterminada, bash no admite comentarios de varias líneas como C o Java. Puede utilizar HereDoc para solucionar este problema.

Esta no es una característica incorporada de bash que admite comentarios de varias líneas, sino solo un truco. Si no está redirigiendo heredoc a ningún comando, el intérprete simplemente leerá el bloque de código y no ejecutará nada.

<< COMMENT
	This is comment line 1
	This is comment line 2
	This is comment line 3
COMMENT

Manejo de espacios en blanco

Por defecto, heredoc no suprimirá ningún carácter de espacio en blanco (tabulaciones, espacios). Podemos anular este comportamiento agregando guión (-) después de (<<) seguido de un delimitador. Esto suprimirá todos los espacios de tabulación, pero los espacios en blanco no se suprimirán.

cat <<- BLOCK
This line has no whitespace.
  This line has 2 white spaces at the beginning.
    This line has a single tab.
        This line has 2 tabs.
            This line has 3 tabs.
BLOCK

Sustitución de variables y comandos

Heredoc acepta la sustitución de variables. Las variables pueden ser variables definidas por el usuario o variables ambientales.

TODAY=$(date +%F)
	
cat << BLOCK1
# User defined variables
Today date is = ${TODAY}
#Environ Variables
I am running as = ${USER}
My home dir is = ${HOME}
I am using ${SHELL} as my shell
BLOCK1

Del mismo modo, puede ejecutar cualquier comando dentro del bloque de código heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Escapar de personajes especiales

Hay varias formas de escapar de los caracteres especiales. O puedes hacerlo a nivel de personaje o nivel de documento.

Para escapar de los caracteres especiales individuales, use una barra invertida (\).

cat << BLOCK4
$(uname -a)
BLOCK4

cat << BLOCK5
Today date is = ${TODAY}
BLOCK5

Para escapar de todos los caracteres especiales dentro del bloque, rodee el delimitador con comillas simples, comillas dobles o delimitador de prefijo con una barra invertida.

cat << 'BLOCK1'
I am running as = ${USER}
BLOCK1

cat << "BLOCK2"
I am running as = ${USER}
BLOCK2

cat << \BLOCK3
I am running as = ${USER}
BLOCK3

Ahora que conocemos la estructura de heredoc y cómo funciona, veamos algunos ejemplos. Dos áreas comunes donde uso heredoc son ejecutar un bloque de comandos a través de SSH y pasar consultas SQL a través de heredoc.

En el siguiente ejemplo, estamos intentando ejecutar un bloque de código en un servidor remoto a través de SSH.

En el siguiente ejemplo, estoy pasando una declaración de selección a psql para conectarme a una base de datos y ejecutar la consulta. Esta es una forma alternativa de ejecutar una consulta en psql dentro del script bash en lugar de usar el indicador -f para ejecutar el archivo .sql.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

psql --username=${UNAME} --password --dbname=${DBNAME} << BLOCK
SELECT * FROM COUNTRIES
WHERE region_id = 4;
BLOCK

Eso es todo por este artículo. Puede hacer mucho más con heredoc en comparación con lo que hemos mostrado en los ejemplos. Si tiene algún truco útil con heredoc, publíquelo en la sección de comentarios para que nuestros lectores puedan beneficiarse de eso.