Jinsi ya kutumia Heredoc katika Maandishi ya Shell


Hapa hati ( Heredoc) ni pembejeo au mtiririko wa faili halisi ambao unachukuliwa kama kizuizi maalum cha msimbo. Kizuizi hiki cha nambari kitapitishwa kwa amri ya kuchakatwa. Heredoc asili ya makombora ya UNIX na inaweza kupatikana katika makombora maarufu ya Linux kama sh, tcsh, ksh, bash, zsh, csh. Hasa, lugha zingine za programu kama Perl, Ruby, PHP pia zinaunga mkono heredoc.

Muundo wa Herdoc

Heredoc hutumia mabano 2 ya pembe (<<) ikifuatiwa na tokeni ya kuweka mipaka. Tokeni sawa ya kuweka mipaka itatumika kukomesha kizuizi cha msimbo. Chochote kinachokuja ndani ya kikomo kinachukuliwa kuwa kizuizi cha nambari.

Tazama mfano hapa chini. Ninaelekeza kizuizi cha nambari kwa amri ya paka. Hapa delimiter imewekwa KUZUIA na kusitishwa na KUZUIA sawa.

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

KUMBUKA: Unapaswa kutumia tokeni sawa ya kuweka kikomo ili kuanza kizuizi na kusitisha kizuizi.

Unda Maoni ya Mistari mingi

Ikiwa unaandika wakati fulani katika bash sasa, unaweza kujua bash kwa chaguo-msingi haiauni maoni ya mitandao mingi kama C au Java. Unaweza kutumia HereDoc kushinda hii.

Hiki si kipengele kilichojengewa ndani cha bash kinachounga mkono maoni ya mistari mingi, lakini ni udukuzi tu. Ikiwa hauelekezi tena heredoc kwa amri yoyote, mkalimani atasoma tu kizuizi cha nambari na hatatekeleza chochote.

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

Kushughulikia Nafasi Nyeupe

Kwa chaguo-msingi, heredoc haitakandamiza herufi zozote za nafasi nyeupe (tabo, nafasi). Tunaweza kubatilisha tabia hii kwa kuongeza dashi (-) baada ya (<<) ikifuatiwa na kikomo. Hii itakandamiza nafasi zote za vichupo lakini nafasi nyeupe hazitakandamizwa.

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

Tofauti na Amri Badala

Heredoc inakubali uingizwaji tofauti. Vigeu vinaweza kuwa vigeu vinavyofafanuliwa na mtumiaji au vigeu vya kimazingira.

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

Vile vile, unaweza kuendesha amri zozote ndani ya kizuizi cha msimbo wa heredoc.

cat << BLOCK2
$(uname -a) 
BLOCK2

Kuepuka Wahusika Maalum

Kuna njia kadhaa tunaweza kuepuka wahusika maalum. Unaweza kuifanya katika kiwango cha mhusika au kiwango cha hati.

Ili kuepuka herufi maalum za kibinafsi tumia backslash (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Ili kuepuka herufi zote maalum ndani ya kizuizi, zunguka kitenganishi kwa nukuu moja, nukuu mbili, au kiambishi awali cha kutofautisha kwa kurudi nyuma.

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

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

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

Sasa kwa kuwa tunajua muundo wa heredoc na jinsi inavyofanya kazi, hebu tuone mifano michache. Maeneo mawili ya kawaida ambapo mimi hutumia heredoc yanaendesha safu ya amri juu ya SSH na kupitisha maswali ya SQL kupitia heredoc.

Katika mfano ulio hapa chini, tunajaribu kutekeleza kizuizi cha msimbo katika seva ya mbali kupitia SSH.

Katika mfano hapa chini ninapitisha taarifa iliyochaguliwa kwa psql kuunganishwa na hifadhidata na kuendesha hoja. Hii ni njia mbadala ya kutekeleza hoja katika psql ndani ya hati ya bash badala ya kutumia -f bendera kuendesha faili ya .sql.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Hiyo ni kwa makala hii. Kuna mengi zaidi unaweza kufanya na heredoc ikilinganishwa na yale ambayo tumeonyesha katika mifano. Ikiwa una udukuzi wowote muhimu na heredoc tafadhali ichapishe kwenye sehemu ya maoni ili wasomaji wetu wanufaike na hilo.