Kaip naudoti „Heredoc“ scenarijų scenarijuose


Čia dokumentas (Heredoc) yra įvesties arba failų srauto pažodinis žodis, kuris laikomas specialiu kodo bloku. Šis kodo blokas bus perduotas komandai apdoroti. „Heredoc“ yra kilęs iš UNIX kriauklių ir jį galima rasti populiariuose „Linux“ kriauklėse, pvz., Sh, tcsh, ksh, bash, zsh, csh. Pažymėtina, kad kitos programavimo kalbos, tokios kaip Perl, Ruby, PHP, taip pat palaiko heredoc.

Herdoc struktūra

„Heredoc“ naudoja 2 kampinius skliaustus (<<) , po kurių yra skiriamojo ženklo. Tas pats atribotuvo žetonas bus naudojamas kodo blokui nutraukti. Viskas, kas patenka į ribotuvą, laikoma kodo bloku.

Pažvelkite į žemiau pateiktą pavyzdį. Peradresuoju kodo bloką į katės komandą. Čia skyriklis nustatomas kaip „BLOCK“ ir baigiamas tuo pačiu „BLOCK“.

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

PASTABA: Norėdami pradėti bloką ir jį nutraukti, turėtumėte naudoti tą patį atribotuvo prieigos raktą.

Kurti kelių eilių komentarus

Jei dabar koduojate kažkada „bash“, galite žinoti, kad „bash“ pagal numatytuosius nustatymus nepalaiko kelių eilių komentarų, tokių kaip „C“ ar „Java“. Norėdami tai įveikti, galite naudoti „HereDoc“.

Tai nėra įmontuota „bash“ funkcija, palaikanti kelių eilučių komentarus, o tiesiog nulaužimas. Jei nenukreipiate heredoc į jokią komandą, vertėjas paprasčiausiai perskaitys kodo bloką ir nieko nevykdys.

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

Baltųjų erdvių tvarkymas

Pagal numatytuosius nustatymus „heredoc“ nenuslopins jokių tarpų (skirtukų, tarpų). Mes galime nepaisyti šios elgsenos pridėdami brūkšnį (-) po (<<) , po kurio yra skiriamasis ženklas. Tai panaikins visus skirtukų tarpus, bet tarpai nebus užgniaužti.

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

Kintamasis ir komandinis pakeitimas

Heredoc priima kintamą pakaitalą. Kintamieji gali būti vartotojo apibrėžti kintamieji arba aplinkos kintamieji.

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

Panašiai galite paleisti visas komandas „heredoc“ kodo bloke.

cat << BLOCK2
$(uname -a) 
BLOCK2

Pabėgimas nuo specialiųjų personažų

Yra keli būdai, kaip galime išvengti specialiųjų personažų. Arba galite tai padaryti simbolių lygiu arba dokumento lygiu.

Norėdami pabėgti nuo atskirų specialiųjų simbolių, naudokite atgalinį brūkšnį (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Norėdami išvengti visų specialių simbolių, esančių bloke, apjuoskite skyriklį vienomis kabutėmis, dvigubomis kabutėmis arba priešdėlinį skiriamąjį ženklą atgaliniu brūkšniu.

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

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

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

Dabar, kai žinome heredoko struktūrą ir kaip jis veikia, pažiūrėkime keletą pavyzdžių. Dvi bendrosios sritys, kuriose naudoju heredoc, paleidžia komandų bloką per SSH ir perduoda SQL užklausas per heredoc.

Žemiau pateiktame pavyzdyje mes bandome atlikti kodo bloką nuotoliniame serveryje per SSH.

Žemiau pateiktame pavyzdyje perduodu pasirinktą sakinį psql prisijungti prie duomenų bazės ir vykdyti užklausą. Tai yra alternatyvus būdas vykdyti užklausą psql viduje „bash“ scenarijuje, užuot naudojus žymę -f .sql failui paleisti.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Tai šiam straipsniui. Su heredoku galite padaryti daug daugiau, palyginti su tuo, ką parodėme pavyzdžiuose. Jei turite kokių nors naudingų įsilaužimų su heredoc, prašome paskelbti juos komentarų skyriuje, kad mūsų skaitytojai galėtų tuo pasinaudoti.