Kako uporabiti Heredoc pri skriptiranju školjk


Tu je dokument (Heredoc) vhodna beseda ali dobesedni tok datoteke, ki se obravnava kot poseben blok kode. Ta blok kode bo posredovan ukazu za obdelavo. Heredoc izvira iz lupin UNIX in ga najdemo v priljubljenih lupinah Linuxa, kot so sh, tcsh, ksh, bash, zsh, csh. Tudi drugi programski jeziki, kot so Perl, Ruby in PHP, podpirajo heredoc.

Struktura Herdoca

Heredoc uporablja 2 kotna oklepaja (<<) , čemur sledi ločilni žeton. Isti ločilni žeton bo uporabljen za zaključek bloka kode. Karkoli pride v ločilo, se šteje za blok kode.

Oglejte si spodnji primer. Blok kode preusmerjam na ukaz mačka. Tu je ločilo nastavljeno na „BLOCK“ in zaključeno z istim „BLOCK“.

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

OPOMBA: Za začetek bloka in zaključek bloka uporabite isti ločilni žeton.

Ustvari večvrstične komentarje

Če zdaj kodirate nekdaj v bash, morda veste, da bash privzeto ne podpira večvrstičnih komentarjev, kot sta C ali Java. To lahko uporabite s pomočjo HereDoc.

To ni vgrajena lastnost basha, ki podpira večvrstične komentarje, ampak le kramp. Če heredoca ne preusmerite na noben ukaz, bo tolmač preprosto prebral blok kode in ne bo izvedel ničesar.

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

Ravnanje z belimi prostori

Heredoc privzeto ne bo zatiral nobenega presledka (zavihki, presledki). To vedenje lahko preglasimo tako, da za (<<) dodamo pomišljaj (-) , ki mu sledi ločilo. To bo zatrlo vse prostore zavihkov, vendar presledkov ne bo.

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

Zamenjava spremenljivk in ukazov

Heredoc sprejema zamenjavo spremenljivk. Spremenljivke so lahko uporabniško določene spremenljivke ali spremenljivke okolja.

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

Podobno lahko zaženete poljubne ukaze znotraj bloka heredoc kode.

cat << BLOCK2
$(uname -a) 
BLOCK2

Pobeg iz posebnih znakov

Posebnim znakom lahko ubežimo na več načinov. To lahko storite na ravni znakov ali na ravni dokumenta.

Če se želite izogniti posameznim posebnim znakom, uporabite poševnico nazaj (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Če želite ubežati vsem posebnim znakom znotraj bloka, ločilo obdajte z enojnimi narekovaji, dvojnimi narekovaji ali ločilnim predponom s poševnico nazaj.

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

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

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

Zdaj, ko poznamo strukturo heredoka in kako deluje, si oglejmo nekaj primerov. Dve skupni področji, kjer uporabljam heredoc, sta izvajanje ukaza prek SSH in posredovanje poizvedb SQL skozi heredoc.

V spodnjem primeru poskušamo izvršiti blok kode v oddaljenem strežniku prek SSH.

V spodnjem primeru posredujem izjavo select psql, da se poveže z bazo podatkov in zažene poizvedbo. To je alternativni način za poizvedbo v psql v skriptu bash, namesto da bi za zagon datoteke .sql uporabili zastavico -f .

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

To je to za ta članek. S heredocom lahko storite veliko več v primerjavi s tem, kar smo pokazali v primerih. Če imate kakšen koristen kramp s heredoc, ga objavite v oddelku za komentarje, da bodo lahko naši bralci imeli koristi od tega.