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.