Ricerca nel sito web

Come utilizzare Heredoc nello scripting di shell


Here document (Heredoc) è un valore letterale di input o flusso di file che viene trattato come un blocco speciale di codice. Questo blocco di codice verrà passato a un comando per l'elaborazione. Heredoc ha origine nelle shell UNIX e può essere trovato nelle shell Linux più diffuse come sh, tcsh, ksh, bash, zsh, csh. In particolare, anche altri linguaggi di programmazione come Perl, Ruby e PHP supportano Heredoc.

Struttura di Herdoc

Heredoc utilizza 2 parentesi angolari (<<) seguite da un token delimitatore. Lo stesso token delimitatore verrà utilizzato per terminare il blocco di codice. Tutto ciò che rientra nel delimitatore è considerato un blocco di codice.

Guarda l'esempio qui sotto. Sto reindirizzando il blocco di codice al comando cat. Qui il delimitatore è impostato su "BLOCCO" e termina con lo stesso "BLOCCO".

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

NOTA: dovresti utilizzare lo stesso token delimitatore per iniziare il blocco e terminarlo.

Crea commenti su più righe

Se stai scrivendo codice in bash adesso, potresti sapere che bash per impostazione predefinita non supporta commenti su più righe come C o Java. Puoi utilizzare HereDoc per superare questo problema.

Questa non è una funzionalità incorporata di bash che supporta i commenti su più righe, ma solo un trucco. Se non stai reindirizzando heredoc a nessun comando, l'interprete leggerà semplicemente il blocco di codice e non eseguirà nulla.

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

Gestire gli spazi bianchi

Per impostazione predefinita, heredoc non sopprimerà alcun carattere di spazio bianco (tabulazioni, spazi). Possiamo sovrascrivere questo comportamento aggiungendo trattino (-) dopo (<<) seguito da un delimitatore. Ciò sopprimerà tutti gli spazi di tabulazione ma gli spazi bianchi non verranno soppressi.

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

Sostituzione di variabili e comandi

Heredoc accetta la sostituzione di variabili. Le variabili possono essere variabili definite dall'utente o variabili ambientali.

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

Allo stesso modo, puoi eseguire qualsiasi comando all'interno del blocco di codice heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Fuga di caratteri speciali

Esistono diversi modi per sfuggire ai caratteri speciali. Puoi farlo a livello di personaggio o di documento.

Per evitare singoli caratteri speciali, utilizzare una barra rovesciata (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Per eseguire l'escape, tutti i caratteri speciali all'interno del blocco racchiudono il delimitatore con virgolette singole, doppie o il delimitatore del prefisso con una barra rovesciata.

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

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

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

Ora che conosciamo la struttura di heredoc e come funziona, vediamo alcuni esempi. Due aree comuni in cui utilizzo heredoc sono l'esecuzione di un blocco di comandi su SSH e il passaggio di query SQL tramite heredoc.

Nell'esempio seguente, stiamo provando a eseguire un blocco di codice in un server remoto tramite SSH.

Nell'esempio seguente passo un'istruzione select a psql per connettersi a un database ed eseguire la query. Questo è un modo alternativo per eseguire una query in psql all'interno dello script bash invece di utilizzare il flag -f per eseguire il file .sql.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Per questo articolo è tutto. C'è molto di più che puoi fare con heredoc rispetto a quanto mostrato negli esempi. Se hai qualche trucco utile con heredoc, pubblicalo nella sezione commenti in modo che i nostri lettori possano trarne vantaggio.