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.