GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Heredoc Tutorial per principianti

Quando lavori con gli script Bash, potresti trovarti in una situazione in cui devi elaborare una serie di input usando lo stesso comando. Fortunatamente, in Bash c'è un modo per raggiungere questo obiettivo in un modo più ottimale utilizzando HereDoc .

HereDoc, acronimo di Here Document , è un Reindirizzamento di input metodo per passare più input a un programma o comando. Il concetto di heredoc non è esclusivamente correlato a Bash da solo. Molti linguaggi di programmazione popolari come Perl, Ruby, PHP supportano heredoc.

In questo articolo, daremo un'occhiata alla sintassi e all'utilizzo di heredoc con alcuni casi d'uso nel mondo reale. Tutti gli esempi in questo articolo sono creati per essere semplici, quindi anche un principiante può comprendere facilmente questo concetto. Entriamo e iniziamo a giocare con heredoc in Bash.

Sintassi HereDoc

Il diagramma seguente illustra la sintassi di heredoc.

Ecco,

  • Comando - Qualsiasi comando (cat, wc, mail, ecc.) che accetta il reindirizzamento.
  • Operatore di reindirizzamento (<< ) - L'operatore predefinito per HereDoc è << . Reindirizza il blocco di codice al comando per l'elaborazione.
  • Token delimitatore - Il token delimitatore denota l'inizio e la fine del documento (blocco di codice). Il token delimitatore può essere qualsiasi cosa, ma dovrebbe essere identico. In genere vedrai EOF viene utilizzato come token delimitatore che significa "End Of File Stream".

Stampa di stringhe multilinea utilizzando HereDoc in Bash

Iniziamo con un semplice esempio di reindirizzamento di una stringa multilinea e stampata sul terminale.

Il cat il comando accetta un flusso di input e con heredoc, e puoi reindirizzare il blocco di codice per stamparlo sul terminale.

$ cat < Qualcosa non va nel file di input ricevuto per oggi.Contatta il team a valle per farlo correggere.==> SLA MANCATO <==EOF

Risultato:

Qualcosa non va nel file di input ricevuto per oggi.Contatta il team a valle per farlo correggere.==> SLA MANCATO <==

Dai un'occhiata allo snippet di codice sopra. Ho tre righe che vengono reindirizzate al cat comando. Sto usando EOF come delimitatore. Tuttavia, puoi utilizzare qualsiasi cosa come desideri, ma mantenere identici i delimitatori di inizio e fine.

Proviamo con un altro semplice esempio. Reindirizzerò le stesse tre righe a conteggio parole programma. Sto usando un delimitatore diverso (BLK ) qui.

$ wc -l < Qualcosa non va nel file di input ricevuto per oggi.Contatta il team a valle per farlo correggere.==> SLA MANCATO <==BLK

Risultato di esempio:

3

Reindirizzamento e pipe in HereDoc

È possibile combinare l'operatore di reindirizzamento dell'output con heredoc e reindirizzare l'output su un file invece di stamparlo sul terminale.

Sto usando lo stesso esempio che ho usato nella sezione precedente e reindirizzando l'output a un file chiamato log_op.txt .

$ cat < /tmp/log_op.txt Qualcosa non va nel file di input ricevuto per oggi.Contatta il team a valle per farlo correggere.==> SLA MANCATO <==EOF

L'output di heredoc può essere inviato alla pipe operatore per ulteriori elaborazioni.

$ cat < Qualcosa non va nel file di input ricevuto per oggi.Contatta il team a valle per farlo correggere.==> SLA MANCATO <==EOF

Soppressione tab in HereDoc

Quando ci sono spazi bianchi (schede) nel blocco di codice e se desideri sopprimerlo, usa "-" dopo l'operatore di reindirizzamento. Un punto importante da notare è che verranno soppresse solo le schede, non gli spazi.

Dai un'occhiata all'esempio qui sotto. Ho aggiunto un'istruzione condizionale allo stesso esempio che abbiamo visto nelle sezioni precedenti. Le prime due righe in heredoc sono a schede (4) e la terza riga è distanziata (2).

if [[ $x ="err" ]]allora cat <<- err_msg 1. Qualcosa non va nel file di input ricevuto per oggi. 2. Contatta il team a valle per farlo correggere. 3. ==> SLA MANCATO <==err_msgfi

Quando viene inviato il frammento di codice, il mio output sarà il seguente.

1. Qualcosa non va nel file di input ricevuto per oggi.2. Contatta il team a valle per farlo correggere. 3. ==> SLA MANCATO <==

Come puoi vedere, le schede della riga 1 e 2 sono soppresse, ma nella riga 3 poiché vengono utilizzati gli spazi non viene soppressa.

Espansione di variabili e comandi in HereDoc

Non è che puoi passare solo stringhe all'interno del blocco di codice heredoc. È possibile passare variabili ambientali e definite dall'utente ed eseguire comandi all'interno del blocco di codice.

Dai un'occhiata all'esempio qui sotto. All'interno del blocco di codice, ho una variabile definita dall'utente "${AUTHOR}" , una variabile ambientale "${SHELL}" , un comando esterno "whoami" .

Quando questo snippet viene inviato, le variabili e i comandi verranno espansi, quindi verranno reindirizzati al cat comando.

AUTHOR="OSTechNix"cat < 

Risultato di esempio:

Autore:OsTechnixArticolo:Bash HeredocSto usando /bin/bash shellkarthick

È possibile racchiudere il delimitatore iniziale tra virgolette singole per sopprimere l'espansione all'interno del blocco di codice. In questo modo tutto all'interno del blocco di codice verrà trattato come una stringa letterale.

gatto <<'EOF' Autore:${AUTHOR} # USER DEFINED VARIABLEArticolo:Bash HeredocSto usando la shell ${SHELL} # ENV VARIABLE$(whoami) # EXTERNAL COMMANDEOF

Risultato di esempio:

Autore:${AUTHOR} Articolo:Bash HeredocSto usando la shell ${SHELL}$(whoami)

Commenti multilinea con HereDoc

Come forse già saprai, Bash non supporta i commenti su più righe. Usando heredoc, puoi creare commenti su più righe reindirizzando il blocco di codice al no-op comando (: ).

Il no-op è bash integrato che prende l'input e restituisce il codice di uscita zero. Puoi considerarlo come un sinonimo dell'incorporato bash "true" che esce anche dal codice di uscita zero.

:<<'COMMENTI'Autore:OStechnixArticolo:Bash HeredocBashV:5.1.4OS:PoP!_OSCOMMENTS

Avviso: Quasi ogni editor di testo ha la funzione di selezionare più righe e ti consente di commentare o rimuovere il commento premendo un tasto. È meglio attenersi a questo approccio.

Escape di caratteri speciali in HereDoc

I blocchi di codice possono contenere caratteri speciali. Se desideri sfuggire ai caratteri speciali, ci sono alcuni modi per farlo.

Puoi racchiudere il delimitatore con singolo o virgolette doppie o prefisso barra rovesciata con il delimitatore. In questo modo verranno eliminati tutti i caratteri speciali.

# CITAZIONI SINGOLE FUGA gatto <<'EOF' Sto usando la shell ${SHELL} # ENV VARIABLE$(whoami) # EXTERNAL COMMANDEOF
# FUGA DI DOPPIE CITAZIONI gatto <<"EOF" Sto usando la shell ${SHELL} # ENV VARIABLE$(whoami) # EXTERNAL COMMANDEOF
# ESCAPE BACKSLASH gatto <<\EOF Sto usando la shell ${SHELL} # ENV VARIABLE$(whoami) # EXTERNAL COMMANDEOF

Invece di eseguire l'escape di tutti i caratteri speciali, puoi anche eseguire l'escape di particolari caratteri speciali all'interno del blocco aggiungendo una barra rovesciata prima di qualsiasi carattere speciale.

cat < 

Risultato di esempio:

Sto usando la shell karthick ${SHELL} 

Caso d'uso HereDoc

Finora abbiamo visto il costrutto di base di heredoc e il suo utilizzo di base. Ora vediamo alcuni casi d'uso nella vita reale. Nella mia esperienza, ho usato heredoc quando lavoro con ssh e client di database in cui devo eseguire un gruppo di comandi.

Esempio 1:esecuzione come utente diverso all'interno dello script

In alcuni casi, potresti voler eseguire alcune parti del tuo codice come un utente diverso. In tal caso, puoi utilizzare heredoc per reindirizzare i comandi da eseguire come un utente diverso.

Dai un'occhiata all'esempio qui sotto. Sto reindirizzando il blocco di codice a su comando che passerà l'utente a "otechnix" e creerà un file chiamato test se non esiste.

su - ostechnix <  

Esempio 2:utilizzo di HereDoc con client DB

Quando vuoi eseguire una serie di comandi su un database, heredoc ti tornerà utile.

Dai un'occhiata all'esempio qui sotto. Sto interagendo con il client MongoDB mongosh e all'interno di heredoc, vengono passati i comandi del blocco di codice per creare un nuovo database, raccogliere e aggiungere un documento di esempio.

mongosh <  

Potresti conoscere o meno MongoDB, ma va bene. Questo è solo per mostrare come usare heredoc per interagire con i client db. Puoi utilizzare qualsiasi client db come MySQL, psql, sqlite a seconda del database con cui stai lavorando.

Esempio 3:esecuzione di comandi remoti con HereDoc e SSH

Quando desideri eseguire comandi sul server remoto, puoi utilizzare heredoc in combinazione con ssh comando. Normalmente usando ssh comando, puoi eseguire comandi nel server remoto nel modo seguente.

$ ssh [email protetta] "comando"

Devi ripetere lo stesso comando ancora e ancora se desideri eseguire più comandi nell'host remoto. Con heredoc puoi raggruppare tutti i comandi ed eseguirli.

$ ssh -T [email protetta] < 

Quando lo stesso codice deve essere eseguito su più nodi, puoi aggiungere for loop insieme a heredoc. Sto usando lo stesso snippet per la creazione di file che abbiamo visto nel primo esempio.

  • La variabile array "server" contiene l'elenco dei nomi dei server.
  • Il ciclo For itera sulla variabile dell'array.
  • Il comando di creazione file viene passato al comando SSH che eseguirà l'iterazione e creerà file in ciascun server. Assicurati di aggiungere -T flag to ssh comando che disabiliterà l'allocazione pseudo-terminale.
dichiara -a server=( host1 host2 host3 )for host in ${server[@]}do ssh -T [email protected]${host} < 

Conclusione

Heredoc è un concetto importante da comprendere e utilizzare negli script Bash. Quando scrivi molti script imparerai di più su heredoc e sui modi per utilizzarlo in modo ottimale.

Se non hai mai usato heredoc prima, avvia il terminale e prova tutti i frammenti di codice dell'articolo per avere una migliore comprensione.

Lettura correlata:

  • Scripting Bash:variabili spiegate con esempi
  • Scripting Bash:funzioni spiegate con esempi
  • Comando Bash Echo spiegato con esempi in Linux
  • Scripting di Bash:il ciclo For viene spiegato con esempi
  • Scripting Bash:spiegazione del ciclo While e Until con esempi

Linux
  1. Bash HereDoc Tutorial con esempi

  2. Tutorial sul comando cd di Linux per principianti (8 esempi)

  3. Tutorial comando Linux comm per principianti (5 esempi)

  4. Linux df Command Tutorial per principianti (8 esempi)

  5. Tutorial sul comando della data di Linux per principianti (8 esempi)

Linux nl Command Tutorial per principianti (7 esempi)

Tutorial sui comandi Linux nm per principianti (10 esempi)

Esercitazione sui comandi OD Linux per principianti (6 esempi)

Linux w Command Tutorial per principianti (5 esempi)

Tutorial sui comandi Linux ss per principianti (8 esempi)

Bash Scripting Tutorial per principianti