Com utilitzar Heredoc a Shell Scripting


Aquí el document (Heredoc) és un literal d'entrada o flux de fitxers que es tracta com un bloc especial de codi. Aquest bloc de codi es passarà a una ordre per processar-lo. Heredoc s'origina en intèrprets d'ordres UNIX i es pot trobar en intèrprets d'ordres Linux populars com sh, tcsh, ksh, bash, zsh, csh. En particular, altres llenguatges de programació com Perl, Ruby, PHP també admeten heredoc.

Estructura d'Herdoc

Heredoc utilitza 2 claudàtors angulars (<<) seguits d'un testimoni delimitador. S'utilitzarà el mateix testimoni delimitador per acabar el bloc de codi. Tot el que entra dins del delimitador es considera un bloc de codi.

Mireu l'exemple següent. Estic redirigint el bloc de codi a l'ordre cat. Aquí el delimitador s'estableix a BLOC i acaba amb el mateix BLOC.

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

NOTA: Hauríeu d'utilitzar el mateix testimoni delimitador per iniciar el bloc i acabar-lo.

Crea comentaris multilínia

Si ara esteu codificant a bash, potser sabeu que bash per defecte no admet comentaris multilínia com C o Java. Podeu utilitzar HereDoc per superar-ho.

Aquesta no és una característica integrada de bash que admet comentaris de diverses línies, sinó només un pirateig. Si no esteu redirigint heredoc a cap ordre, l'intèrpret simplement llegirà el bloc de codi i no executarà res.

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

Tractament d'espais en blanc

Per defecte, heredoc no suprimirà cap caràcter d'espai en blanc (tabulacions, espais). Podem anul·lar aquest comportament afegint guionet (-) després de (<<) seguit d'un delimitador. Això suprimirà tots els espais de tabulació, però els espais en blanc no se suprimiran.

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

Substitució de variables i comandaments

Heredoc accepta la substitució de variables. Les variables poden ser variables definides per l'usuari o variables ambientals.

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 la mateixa manera, podeu executar qualsevol ordre dins del bloc de codi heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Escapar de personatges especials

Hi ha diverses maneres d'escapar dels personatges especials. O podeu fer-ho a nivell de personatge o a nivell de document.

Per escapar de caràcters especials individuals, utilitzeu una barra invertida (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Per escapar de tots els caràcters especials dins del bloc, envolta el delimitador amb cometes simples, cometes dobles o delimitador de prefix amb 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

Ara que coneixem l'estructura d'heredoc i com funciona, vegem-ne alguns exemples. Dues àrees comunes on faig servir heredoc són executar un bloc d'ordres sobre SSH i passar consultes SQL a través d'heredoc.

A l'exemple següent, estem intentant executar un bloc de codi en un servidor remot mitjançant SSH.

A l'exemple següent, passo una instrucció select a psql per connectar-se a una base de dades i executar la consulta. Aquesta és una manera alternativa d'executar una consulta en psql dins de l'script bash en comptes d'utilitzar el senyalador -f per executar el fitxer .sql.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Això és tot per aquest article. Hi ha molt més que podeu fer amb heredoc en comparació amb el que hem mostrat als exemples. Si teniu algun truc útil amb Heredoc, publiqueu-lo a la secció de comentaris perquè els nostres lectors se'n puguin beneficiar.