Kuinka Heredocia käytetään komentosarjakirjoituksissa


Tässä dokumentti (Heredoc) on syötteen tai tiedostovirran kirjain, jota käsitellään erityisenä koodilohkona. Tämä koodilohko välitetään komennolle käsittelyä varten. Heredoc on peräisin UNIX-kuoreista ja löytyy suosituista Linux-kuoreista, kuten sh, tcsh, ksh, bash, zsh, csh. Erityisesti muut ohjelmointikielet, kuten Perl, Ruby, PHP, tukevat myös heredocia.

Herdocin rakenne

Heredoc käyttää kahta kulmasulmaa (<<) , jota seuraa erottimen tunnus. Samaa erottimen tunnusta käytetään koodilohkon lopettamiseen. Mitä erottimen sisällä on, sitä pidetään koodilohkona.

Katso alla olevaa esimerkkiä. Ohjaan koodilohkon kissakomentoon. Tässä erottimeksi asetetaan ”BLOCK” ja sen päättää sama “BLOCK”.

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

HUOMAUTUS: Sinun tulisi käyttää samaa erottimen tunnusta lohkon aloittamiseksi ja lopettamiseksi.

Luo monirivisiä kommentteja

Jos koodaat joskus bashissa nyt, saatat tietää, että bash ei oletusarvoisesti tue monirivisiä kommentteja, kuten C tai Java. Voit käyttää HereDocia tämän voittamiseksi.

Tämä ei ole sisäänrakennettu bash-ominaisuus, joka tukee monirivisiä kommentteja, vaan vain hakata. Jos et ohjaa heredocia mihinkään komentoon, tulkki lukee yksinkertaisesti koodilohkon eikä suorita mitään.

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

Valkoisten tilojen käsittely

Oletusarvoisesti heredoc ei estä välilyöntejä (välilehtiä, välilyöntejä). Voimme ohittaa tämän käyttäytymisen lisäämällä viiva (-) (<<) -kohdan jälkeen ja sen jälkeen erotin. Tämä tukahduttaa kaikki välilehdet, mutta tyhjät tilat eivät ole tukossa.

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

Vaihteleva ja komentokorvaus

Heredoc hyväksyy vaihtelevan korvaamisen. Muuttujat voivat olla käyttäjän määrittämiä muuttujia tai ympäristömuuttujia.

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

Vastaavasti voit suorittaa minkä tahansa komennot heredoc-koodilohkon sisällä.

cat << BLOCK2
$(uname -a) 
BLOCK2

Pakenevat erikoismerkit

Erikoismerkkejä voi paeta useilla tavoilla. Voit joko tehdä sen merkkitasolla tai dokumenttitasolla.

Voit välttää yksittäisiä erikoismerkkejä käyttämällä vinoviivaa (\).

cat << BLOCK4
$(uname -a)
BLOCK4

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

Jos haluat välttää kaikki lohkon sisällä olevat erikoismerkit, ympäröi erotin yksittäisillä lainausmerkeillä, kaksoislainausmerkeillä tai etuliitteen erotin viivaviivalla.

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

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

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

Nyt kun tiedämme heredocin rakenteen ja miten se toimii, katsotaanpa muutama esimerkki. Kaksi yleistä aluetta, joissa käytän heredocia, ajaa komentoja SSH: n yli ja välittää SQL-kyselyitä heredocin kautta.

Alla olevassa esimerkissä yritämme suorittaa koodilohkon etäpalvelimessa SSH: n kautta.

Seuraavassa esimerkissä välitän select-lauseen psql: lle yhteyden muodostamiseksi tietokantaan ja kyselyn suorittamiseksi. Tämä on vaihtoehtoinen tapa suorittaa kysely psql: ssä bash-komentosarjassa sen sijaan, että käyttäisit .code-tiedostoa -f -lipulla.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

Se on tässä artikkelissa. Heredocilla voi tehdä paljon enemmän verrattuna siihen, mitä olemme osoittaneet esimerkeissä. Jos sinulla on hyödyllistä hakkerointia heredocin kanssa, lähetä se kommenttiosioon, jotta lukijamme voisivat hyötyä siitä.