Giunsa Paggamit ang Heredoc sa Shell Scripting


Dinhi ang dokumento (Heredoc) usa ka input o file stream nga literal nga giisip nga usa ka espesyal nga bloke sa code. Kini nga bloke sa code ipasa sa usa ka mando alang sa pagproseso. Ang Heredoc naggikan sa UNIX shells ug makita sa sikat nga Linux shells sama sa sh, tcsh, ksh, bash, zsh, csh. Ilabi na, ang ubang mga programming language sama sa Perl, Ruby, PHP nagsuporta usab sa heredoc.

Istruktura ni Herdoc

Ang Heredoc naggamit ug 2 ka anggulo nga bracket (<<) nga gisundan ug delimiter token. Ang parehas nga delimiter token gamiton aron tapuson ang block sa code. Bisan unsa nga moabut sa sulod sa delimiter giisip nga usa ka bloke sa code.

Tan-awa ang pananglitan sa ubos. Gi-redirect nako ang block sa code sa cat command. Dinhi ang delimiter gibutang sa BLOCK ug gitapos sa parehas nga BLOCK.

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

PAHINUMDOM: Kinahanglan nimong gamiton ang parehas nga timaan sa delimiter aron masugdan ang block ug tapuson ang block.

Paghimo Multiline Comments

Kung nag-coding ka usahay sa bash karon, mahimo nimong nahibal-an nga ang bash sa default wala nagsuporta sa mga komento sa multiline sama sa C o Java. Mahimo nimong gamiton ang HereDoc aron mabuntog kini.

Dili kini usa ka built-in nga bahin sa bash nga nagsuporta sa multi-line nga komento, apan usa lamang ka hack. Kung wala ka mag-redirect sa heredoc sa bisan unsang sugo, ang tighubad mobasa lang sa block sa code ug dili mopatuman sa bisan unsa.

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

Pagdumala sa White Spaces

Sa kasagaran, dili pugngan sa heredoc ang bisan unsang puti nga mga karakter sa espasyo (mga tab, mga espasyo). Mahimo natong i-override kini nga kinaiya pinaagi sa pagdugang dash (-) human sa (<<) nga sundan ug delimiter. Kini magpugong sa tanan nga mga tab space apan ang puti nga mga luna dili mapugngan.

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 ug Command Substiution

Gidawat sa Heredoc ang variable substitution. Ang mga variable mahimong mga variable nga gitakda sa user o mga variable sa palibot.

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

Sa susama, mahimo nimong ipadagan ang bisan unsang mga mando sa sulod sa block nga heredoc code.

cat << BLOCK2
$(uname -a) 
BLOCK2

Pag-ikyas sa Espesyal nga mga Karakter

Adunay daghang mga paagi nga makalingkawas kita sa mga espesyal nga karakter. Mahimo nimo kini sa lebel sa karakter o lebel sa doc.

Aron makalingkawas sa indibidwal nga espesyal nga mga karakter gamita ang backslash (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Aron makalingkawas sa tanang espesyal nga karakter sa sulod sa block palibutan ang delimiter nga adunay usa ka kinutlo, doble nga mga kinutlo, o prefix delimiter nga adunay 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

Karon nga nahibal-an na naton ang istruktura sa heredoc ug kung giunsa kini molihok, tan-awon naton ang pipila ka mga pananglitan. Duha ka sagad nga mga lugar diin akong gigamit ang heredoc nagpadagan sa usa ka bloke sa mga mando sa SSH ug gipasa ang mga pangutana sa SQL pinaagi sa heredoc.

Sa ubos nga pananglitan, kami naningkamot sa pagpatuman sa usa ka block sa code sa usa ka hilit nga server pinaagi sa SSH.

Sa ubos nga pananglitan gipasa nako ang usa ka pinili nga pahayag sa psql aron makonektar sa usa ka database ug ipadagan ang pangutana. Kini usa ka alternatibong paagi sa pagpadagan sa usa ka pangutana sa psql sulod sa bash script imbes nga gamiton ang -f nga bandila sa pagpadagan sa .sql file.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Mao kana alang niini nga artikulo. Daghan pa ang imong mahimo sa heredoc kumpara sa among gipakita sa mga pananglitan. Kung ikaw adunay bisan unsang mapuslanon nga hack sa heredoc palihug i-post kini sa seksyon sa komento aron ang among mga magbabasa makabenepisyo gikan niana.