“Shell Scripting” -de “Heredoc” -y nädip ulanmaly


Bu ýerde resminama (Heredoc), koduň ýörite bloky hökmünde garalýan giriş ýa-da faýl akymy. Bu kod bloky gaýtadan işlemek buýrugyna geçiriler. Heredoc UNIX gabyklarynda döräp, sh, tcsh, ksh, bash, zsh, csh ýaly meşhur Linux gabyklarynda tapylyp bilner. Pereri gelende aýtsak, Perl, Ruby, PHP ýaly beýleki programmirleme dilleri hem heredoc-y goldaýar.

Herdokyň gurluşy

Heredoc 2 burçly ýaýdan peýdalanýar (<<) , soň bolsa delimiter belligi. Kod blokuny ýatyrmak üçin şol bir delimiter belligi ulanylar. Aýyrmagyň içinde näme bolsa, kod bloky hasaplanýar.

Aşakdaky mysala serediň. Kod blokyny pişik buýrugyna gönükdirýärin. Bu ýerde delimiter “BLOK” diýlip kesgitlenýär we şol bir “BLOK” bilen ýatyrylýar.

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

BELLIK: Bloky başlamak we bloky ýatyrmak üçin şol bir delimiter belligini ulanmaly.

Köp teswirleri dörediň

Häzir başda kodlaýan bolsaňyz, başda C ýa-da Java ýaly köp setirli teswirleri goldamaýandygyny bilip bilersiňiz. Muny ýeňip geçmek üçin HereDoc ulanyp bilersiňiz.

Bu, köp setirli teswirleri goldaýan başyň içerki aýratynlygy däl, diňe bir hak. Heredoklary haýsydyr bir buýruga gönükdirmeýän bolsaňyz, terjimeçi diňe kod blokyny okar we hiç zat ýerine ýetirmez.

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

Ak ýerleri dolandyrmak

Düzgüne görä, heredoc hiç bir ak kosmos nyşanlaryny (goýmalar, boşluklar) basyp bilmez. (<<) dan soň delimiterden soň dash (-) goşmak bilen bu häsiýeti ýok edip bileris. Bu, ähli tab boşluklaryny basyp ýatyrar, ýöne ak boşluklar basylmaz.

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

Üýtgeýän we buýruk çalyşmagy

Heredoc üýtgeýän çalyşmagy kabul edýär. Üýtgeýjiler ulanyjy kesgitlän üýtgeýjiler ýa-da daşky gurşaw üýtgeýjileri bolup biler.

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

Şonuň ýaly-da, heredoc kod blokynyň içinde islendik buýruklary işledip bilersiňiz.

cat << BLOCK2
$(uname -a) 
BLOCK2

Specialörite nyşanlardan gaçmak

Specialörite nyşanlardan gaçmagyň birnäçe usuly bar. Charactera-da nyşan derejesinde ýa-da dokument derejesinde edip bilersiňiz.

Aýry-aýry aýratyn nyşanlardan gaçmak üçin yzky çyzgydan peýdalanyň (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Blokyň içindäki ähli aýratyn nyşanlardan gaçmak üçin delimiteri ýeke sitata, goşa dyrnak ýa-da arka tarapy bilen prefiks delimiter bilen gurşap alyň.

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

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

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

Heredokyň gurluşyny we onuň nähili işleýändigini bilip, indi birnäçe mysal göreliň. Heredok ulanýan iki umumy ýerim, SSH-den buýruklar toplumy we SQL talaplaryny heredoc arkaly geçirmek.

Aşakdaky mysalda, uzak serwerde kod blokyny SSH arkaly ýerine ýetirmäge synanyşýarys.

Aşakdaky mysalda maglumat bazasyna birikmek we soragy işletmek üçin psql-a saýlanan jümläni iberýärin. Bu .sql faýlyny işletmek üçin -f baýdagyny ulanmagyň ýerine baş skriptiň içindäki psql-de soragy işletmegiň alternatiw usulydyr.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Bu makala üçin. Mysallarda görkezişimiz bilen deňeşdireniňde, heredok bilen edip boljak köp zat bar. “Heredoc” bilen haýsydyr bir peýdaly hakyňyz bar bolsa, okyjylarymyz ondan peýdalanmagy üçin teswirler bölüminde ýerleşdirmegiňizi haýyş edýäris.