Wéi benotzt Dir Heredoc a Shell Scripting


Hei Dokument (Heredoc) ass en Input oder Dateistream wuertwiertlech deen als e spezielle Codeblock behandelt gëtt. Dëse Block vum Code gëtt un e Kommando fir d'Veraarbechtung weiderginn. Heredoc staamt aus UNIX Shells a kann a populäre Linux Shells wéi sh, tcsh, ksh, bash, zsh, csh fonnt ginn. Notamment aner Programméierungssprooche wéi Perl, Ruby, PHP ënnerstëtzen och Heredoc.

Struktur vun Herdoc

Heredoc benotzt 2 Wénkel Klammeren (<<) gefollegt vun engem Delimiter Token. Deeselwechten Ofgrenzer Token gëtt benotzt fir de Block vum Code ofzeschléissen. Wat och ëmmer am Ofgrenzer kënnt, gëtt als e Block vu Code ugesinn.

Kuckt d'Beispill hei ënnen. Ech redirect de Block vum Code op de Cat Kommando. Hei ass den Ofgrenzer op BLOCK gesat a vum selwechte BLOCK ofgeschloss.

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

NOTÉIERT: Dir sollt deeselwechten Delimiter Token benotzen fir de Block ze starten an de Block ofzeschléissen.

Schafen Multiline Kommentaren

Wann Dir elo iergendwann am Bash codéiert, wësst Dir vläicht datt Bash als Standard net Multiline Kommentarer wéi C oder Java ënnerstëtzt. Dir kënnt HereDoc benotzen fir dëst ze iwwerwannen.

Dëst ass net eng agebaute Feature vu Bash déi Multi-Line Kommentar ënnerstëtzt, awer just en Hack. Wann Dir den Heredoc net op e Kommando ëmgeleet, liest den Dolmetscher einfach de Codeblock a wäert näischt ausféieren.

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

Ëmgank mat wäiss Plazen

Par défaut wäert heredoc keng wäiss Plaz Zeechen (Tabs, Plazen) ënnerdrécken. Mir kënnen dëst Verhalen iwwerschreiden andeems Dir Dash (-) no (<<) bäigefüügt vun engem Delimiter. Dëst wäert all Tabsplazen ënnerdrécken awer wäiss Plazen ginn net ënnerdréckt.

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

Variabel a Kommando Substitutioun

Heredoc akzeptéiert variabel Substitutioun. Variablen kënne Benotzerdefinéiert Variablen oder Ëmweltvariablen sinn.

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

Ähnlech kënnt Dir all Kommandoen am Heredoc Code Block ausféieren.

cat << BLOCK2
$(uname -a) 
BLOCK2

Auswee Special Charaktere

Et gi verschidde Méiglechkeeten, mir kënne speziell Charaktere flüchten. Entweder Dir kënnt et um Charakterniveau oder Doc-Niveau maachen.

Fir eenzel speziell Zeechen ze entkommen, benotzt e Réckschnëtt (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Fir all d'Spezialzeechen am Block ze entkommen, ëmginn den Ofgrenzer mat eenzelen Zitater, Duebel Zitater oder Präfix Delimiter mat engem Réckschnëtt.

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

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

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

Elo wou mir d'Struktur vum Heredoc kennen a wéi et funktionnéiert, kucke mer e puer Beispiller. Zwee gemeinsam Beräicher wou ech Heredoc benotzen lafen e Block vu Kommandoen iwwer SSH a passéieren SQL Ufroen duerch Heredoc.

Am Beispill hei ënnen probéieren mir e Block vu Code an engem Remote Server duerch SSH auszeféieren.

Am Beispill hei ënnen ginn ech eng gewielte Ausso op psql fir mat enger Datebank ze verbannen an d'Ufro auszeféieren. Dëst ass en alternativen Wee fir eng Ufro an psql am Bash-Skript auszeféieren anstatt de -f-Fändel ze benotzen fir .sql-Datei auszeféieren.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Dat ass et fir dësen Artikel. Et gëtt vill méi Dir mat Heredoc maache kënnt am Verglach zu deem wat mir an de Beispiller gewisen hunn. Wann Dir en nëtzlechen Hack mat Heredoc hutt, post et w.e.g. an der Kommentarsektioun sou datt eis Lieser dovu profitéiere kënnen.