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.