Hvernig á að nota Heredoc í Shell Scripting


Hér skjal (Heredoc) er inntak eða skráarstraumur bókstaflega sem er meðhöndlað sem sérstakur kóðablokk. Þessi kóðablokk verður send til skipunar til vinnslu. Heredoc er upprunnið í UNIX skeljum og er að finna í vinsælum Linux skeljum eins og sh, tcsh, ksh, bash, zsh, csh. Einkum styðja önnur forritunarmál eins og Perl, Ruby, PHP einnig heredoc.

Uppbygging Herdoc

Heredoc notar 2 hornklofa (<<) á eftir með afmörkunarmerki. Sami afmörkunartákn verður notaður til að loka kóðablokkinni. Hvað sem kemur innan afmörkunar er talið vera kóðablokk.

Skoðaðu dæmið hér að neðan. Ég er að beina kóðablokkinni yfir í cat skipunina. Hér er afmörkunin stillt á „BLOCK“ og hætt með sama „LOCK“.

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

ATHUGIÐ: Þú ættir að nota sama afmörkunartáknið til að hefja blokkina og binda enda á blokkina.

Búðu til marglínu athugasemdir

Ef þú ert að kóða einhvern tíma í bash núna, gætirðu vitað að bash styður sjálfgefið ekki marglínu athugasemdir eins og C eða Java. Þú getur notað HereDoc til að sigrast á þessu.

Þetta er ekki innbyggður eiginleiki bash sem styður marglínu athugasemd, heldur bara hakk. Ef þú ert ekki að beina heredoc í neina skipun mun túlkurinn einfaldlega lesa kóðablokkinn og ekki framkvæma neitt.

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

Meðhöndlun hvítra rýma

Sjálfgefið, heredoc mun ekki bæla neina hvíta stafina (flipa, bil). Við getum hnekið þessari hegðun með því að bæta strik (-) á eftir (<<) og síðan afmarka. Þetta mun bæla niður öll flipabil en hvít bil verða ekki bæld niður.

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

Variable og Command Substitution

Heredoc samþykkir breytileg skipti. Breytur geta verið notendaskilgreindar breytur eða umhverfisbreytur.

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

Á sama hátt geturðu keyrt hvaða skipanir sem er inni í heredoc kóðablokkinni.

cat << BLOCK2
$(uname -a) 
BLOCK2

Að flýja sérstafi

Það eru nokkrar leiðir til að flýja sérstafi. Annaðhvort geturðu gert það á persónustigi eða doc stigi.

Notaðu skástrik (\) til að sleppa við einstaka sérstafi.

cat << BLOCK4
$(uname -a)
BLOCK4

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

Til að sleppa undan öllum sértáknum inni í kubbnum skaltu umkringja afmörkunina með stökum gæsalappir, tvöfaldar gæsalappir eða forskeyti afmarka með skástrik.

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

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

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

Nú þegar við þekkjum uppbyggingu heredoc og hvernig það virkar skulum við sjá nokkur dæmi. Tvö algeng svæði þar sem ég nota heredoc eru að keyra blokk af skipunum yfir SSH og senda SQL fyrirspurnir í gegnum heredoc.

Í dæminu hér að neðan erum við að reyna að keyra kóðablokk á ytri netþjóni í gegnum SSH.

Í dæminu hér að neðan sendi ég valyfirlýsingu til psql til að tengjast gagnagrunni og keyra fyrirspurnina. Þetta er önnur leið til að keyra fyrirspurn í psql inni í bash skriftu í stað þess að nota -f fánann til að keyra .sql skrá.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Það er það fyrir þessa grein. Það er miklu meira sem þú getur gert með heredoc miðað við það sem við höfum sýnt í dæmunum. Ef þú ert með eitthvað gagnlegt hakk með heredoc vinsamlegast settu það í athugasemdareitinn svo lesendur okkar gætu notið góðs af því.