Búsqueda de sitios web

Cómo utilizar Heredoc en secuencias de comandos de Shell


Aquí, el documento (Heredoc) es un literal de flujo de archivo o entrada que se trata como un bloque de código especial. Este bloque de código se pasará a un comando para su procesamiento. Heredoc se origina en shells 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 y PHP también son compatibles con heredoc.

Estructura de Herdoc

Heredoc utiliza 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 utilizar el mismo token delimitador para iniciar y finalizar el bloque.

Crear comentarios multilínea

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

Esta no es una característica incorporada de bash que admite comentarios de varias líneas, sino simplemente un truco. Si no redirige 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

De forma predeterminada, 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 no se suprimirán los espacios en blanco.

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

De manera similar, puede ejecutar cualquier comando dentro del bloque de código heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Escapar de caracteres especiales

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

Para escapar de caracteres especiales individuales utilice 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, coloque el delimitador entre comillas simples, comillas dobles o el 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, intentamos ejecutar un bloque de código en un servidor remoto a través de SSH.

En el siguiente ejemplo, paso una instrucción select 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. Puedes 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 él.