Kif tuża Heredoc fi Shell Scripting


Hawnhekk id-dokument (Heredoc) huwa input jew fluss ta 'fajl litterali li huwa ttrattat bħala blokk speċjali ta' kodiċi. Din il-blokka ta' kodiċi se tiġi mgħoddija lil kmand għall-ipproċessar. Heredoc joriġina minn qxur UNIX u jista 'jinstab f'qxur Linux popolari bħal sh, tcsh, ksh, bash, zsh, csh. Notevolment, lingwi ta 'programmar oħra bħal Perl, Ruby, PHP jappoġġjaw ukoll heredoc.

Struttura ta' Herdoc

Heredoc juża 2 parentesi angolari (<<) segwiti minn token delimitatur. L-istess token delimitatur se jintuża biex itemm il-blokk tal-kodiċi. Kwalunkwe li jidħol fid-delimitatur huwa meqjus bħala blokk ta 'kodiċi.

Ħares lejn l-eżempju hawn taħt. Qed nidderieġi l-blokk tal-kodiċi għall-kmand tal-qtates. Hawnhekk id-delimitatur huwa ssettjat għal BLOCK u mitmum bl-istess BLOCK.

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

NOTA: Għandek tuża l-istess token delimitatur biex tibda l-blokk u ttemm il-blokk.

Oħloq Kummenti Multiline

Jekk qed tikkodifika f'xi żmien f'bash issa, tista 'tkun taf li bash awtomatikament ma jappoġġjax kummenti b'ħafna linji bħal C jew Java. Tista' tuża HereDoc biex tegħleb dan.

Din mhix karatteristika integrata ta 'bash li tappoġġja kumment b'ħafna linji, iżda biss hack. Jekk m'intix qed tidderieġi heredoc għal xi kmand, l-interpretu sempliċement jaqra l-blokk tal-kodiċi u ma jesegwixxi xejn.

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

Immaniġġjar ta' Spazji Bojod

B'mod awtomatiku, heredoc ma jrażżan ebda karattri ta' spazju abjad (tabs, spazji). Nistgħu negħlbu din l-imġieba billi nżidu sing (-) wara (<<) segwit minn delimitatur. Dan se jrażżan l-ispazji tat-tab kollha iżda l-ispazji bojod mhux se jiġu mrażżna.

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

Varjabbli u Sostituzzjoni tal-Kmand

Heredoc jaċċetta sostituzzjoni varjabbli. Varjabbli jistgħu jkunu varjabbli definiti mill-utent jew varjabbli ambjentali.

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

Bl-istess mod, tista 'tmexxi kwalunkwe kmandi ġewwa l-blokka tal-kodiċi heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Jaħarbu Karattri Speċjali

Hemm diversi modi kif nistgħu naħarbu karattri speċjali. Jew tista 'tagħmel dan fil-livell ta' karattru jew livell ta 'dok.

Biex taħrab karattri speċjali individwali uża backslash (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Biex taħrab il-karattri speċjali kollha ġewwa l-blokka, iddawru d-delimitatur bi kwotazzjonijiet singoli, kwotazzjonijiet doppji, jew delimitatur tal-prefiss b'backslash.

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

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

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

Issa li nafu l-istruttura ta’ heredoc u kif taħdem, ejja naraw ftit eżempji. Żewġ oqsma komuni fejn nuża heredoc qed imexxu blokk ta 'kmandi fuq SSH u jgħaddu mistoqsijiet SQL permezz heredoc.

Fl-eżempju t'hawn taħt, qed nippruvaw noqogħdu nwettqu blokka ta 'kodiċi f'server remot permezz ta' SSH.

Fl-eżempju ta 'hawn taħt qed ngħaddi dikjarazzjoni ta' selezzjoni lil psql biex tikkonnettja ma 'database u tmexxi l-mistoqsija. Dan huwa mod alternattiv biex tmexxi mistoqsija f'psql ġewwa script bash minflok tuża l-marka -f biex tmexxi fajl .sql.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Dak hu għal dan l-artikolu. Hemm ħafna aktar li tista 'tagħmel b'heredoc meta mqabbel ma' dak li wrejna fl-eżempji. Jekk għandek xi hack utli ma heredoc jekk jogħġbok ibgħatha fit-taqsima tal-kummenti sabiex il-qarrejja tagħna jkunu jistgħu jibbenefikaw minn dan.