ഷെൽ സ്ക്രിപ്റ്റിംഗിൽ ഹെറെഡോക് എങ്ങനെ ഉപയോഗിക്കാം


ഇവിടെ ഡോക്യുമെന്റ് (Heredoc) എന്നത് ഒരു ഇൻപുട്ട് അല്ലെങ്കിൽ ഫയൽ സ്ട്രീം ലിറ്ററൽ ആണ്, അത് ഒരു പ്രത്യേക കോഡായി കണക്കാക്കുന്നു. ഈ കോഡ് ബ്ലോക്ക് പ്രോസസ്സിംഗിനായി ഒരു കമാൻഡിലേക്ക് കൈമാറും. UNIX ഷെല്ലുകളിൽ നിന്നാണ് ഹെറെഡോക്ക് ഉത്ഭവിക്കുന്നത്, ഇത് sh, tcsh, ksh, bash, zsh, csh പോലുള്ള ജനപ്രിയ ലിനക്സ് ഷെല്ലുകളിൽ കാണാം. Perl, Ruby, PHP തുടങ്ങിയ മറ്റ് പ്രോഗ്രാമിംഗ് ഭാഷകളും ഹെറെഡോക്കിനെ പിന്തുണയ്ക്കുന്നു എന്നത് ശ്രദ്ധേയമാണ്.

ഹെർഡോക്കിന്റെ ഘടന

ഹെറെഡോക്ക് 2 ആംഗിൾ ബ്രാക്കറ്റുകൾ (<<) തുടർന്ന് ഒരു ഡിലിമിറ്റർ ടോക്കൺ ഉപയോഗിക്കുന്നു. കോഡിന്റെ ബ്ലോക്ക് അവസാനിപ്പിക്കാൻ ഇതേ ഡിലിമിറ്റർ ടോക്കൺ ഉപയോഗിക്കും. ഡിലിമിറ്ററിനുള്ളിൽ വരുന്നതെന്തും കോഡിന്റെ ഒരു ബ്ലോക്കായി കണക്കാക്കപ്പെടുന്നു.

ചുവടെയുള്ള ഉദാഹരണം നോക്കുക. ഞാൻ കോഡിന്റെ ബ്ലോക്ക് ക്യാറ്റ് കമാൻഡിലേക്ക് റീഡയറക്uട് ചെയ്യുന്നു. ഇവിടെ ഡിലിമിറ്റർ ബ്ലോക്ക് ആയി സജ്ജീകരിക്കുകയും അതേ ബ്ലോക്ക് ഉപയോഗിച്ച് അവസാനിപ്പിക്കുകയും ചെയ്യുന്നു.

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

ശ്രദ്ധിക്കുക: ബ്ലോക്ക് ആരംഭിക്കുന്നതിനും ബ്ലോക്ക് അവസാനിപ്പിക്കുന്നതിനും നിങ്ങൾ അതേ ഡിലിമിറ്റർ ടോക്കൺ ഉപയോഗിക്കണം.

മൾട്ടിലൈൻ അഭിപ്രായങ്ങൾ സൃഷ്ടിക്കുക

നിങ്ങൾ ഇപ്പോൾ എപ്പോഴെങ്കിലും ബാഷിൽ കോഡ് ചെയ്യുകയാണെങ്കിൽ, C അല്ലെങ്കിൽ Java പോലുള്ള മൾട്ടിലൈൻ കമന്റുകളെ ബാഷ് പിന്തുണയ്ക്കുന്നില്ലെന്ന് നിങ്ങൾക്ക് അറിയാം. ഇത് മറികടക്കാൻ നിങ്ങൾക്ക് HereDoc ഉപയോഗിക്കാം.

ഇത് മൾട്ടി-ലൈൻ കമന്റിനെ പിന്തുണയ്ക്കുന്ന ബാഷിന്റെ ബിൽറ്റ്-ഇൻ സവിശേഷതയല്ല, ഒരു ഹാക്ക് മാത്രമാണ്. നിങ്ങൾ ഹെറെഡോക്ക് ഏതെങ്കിലും കമാൻഡിലേക്ക് റീഡയറക്uട് ചെയ്യുന്നില്ലെങ്കിൽ, വ്യാഖ്യാതാവ് കോഡിന്റെ ബ്ലോക്ക് വായിക്കുകയും ഒന്നും എക്uസിക്യൂട്ട് ചെയ്യുകയുമില്ല.

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

വൈറ്റ് സ്പേസുകൾ കൈകാര്യം ചെയ്യുന്നു

സ്ഥിരസ്ഥിതിയായി, ഹെറെഡോക്ക് വൈറ്റ് സ്പേസ് പ്രതീകങ്ങളൊന്നും (ടാബുകൾ, സ്uപെയ്uസുകൾ) അടിച്ചമർത്തില്ല. (<<) ന് ശേഷം ഒരു ഡീലിമിറ്ററിന് ശേഷം dash (-) ചേർത്ത് നമുക്ക് ഈ സ്വഭാവം അസാധുവാക്കാം. ഇത് എല്ലാ ടാബ് സ്uപെയ്uസുകളെയും അടിച്ചമർത്തും എന്നാൽ വൈറ്റ് സ്uപെയ്uസുകൾ അടിച്ചമർത്തപ്പെടില്ല.

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

വേരിയബിളും കമാൻഡ് സബ്സ്റ്റിയുഷനും

ഹെറെഡോക്ക് വേരിയബിൾ സബ്സ്റ്റിറ്റ്യൂഷൻ സ്വീകരിക്കുന്നു. വേരിയബിളുകൾ ഉപയോക്തൃ നിർവചിച്ച വേരിയബിളുകളോ പരിസ്ഥിതി വേരിയബിളുകളോ ആകാം.

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

അതുപോലെ, ഹെറെഡോക് കോഡ് ബ്ലോക്കിനുള്ളിൽ നിങ്ങൾക്ക് ഏത് കമാൻഡും പ്രവർത്തിപ്പിക്കാൻ കഴിയും.

cat << BLOCK2
$(uname -a) 
BLOCK2

പ്രത്യേക കഥാപാത്രങ്ങളിൽ നിന്ന് രക്ഷപ്പെടുന്നു

പ്രത്യേക പ്രതീകങ്ങളിൽ നിന്ന് രക്ഷപ്പെടാൻ നിരവധി മാർഗങ്ങളുണ്ട്. ഒന്നുകിൽ നിങ്ങൾക്ക് അത് പ്രതീക തലത്തിലോ ഡോക് തലത്തിലോ ചെയ്യാം.

വ്യക്തിഗത പ്രത്യേക പ്രതീകങ്ങളിൽ നിന്ന് രക്ഷപ്പെടാൻ ഒരു ബാക്ക്സ്ലാഷ് (\) ഉപയോഗിക്കുക.

cat << BLOCK4
$(uname -a)
BLOCK4

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

ബ്ലോക്കിനുള്ളിലെ എല്ലാ പ്രത്യേക പ്രതീകങ്ങളിൽ നിന്നും രക്ഷപ്പെടാൻ ഒറ്റ ഉദ്ധരണികൾ, ഇരട്ട ഉദ്ധരണികൾ അല്ലെങ്കിൽ ഒരു ബാക്ക്uസ്ലാഷ് ഉള്ള പ്രിഫിക്uസ് ഡിലിമിറ്റർ എന്നിവ ഉപയോഗിച്ച് ഡിലിമിറ്ററിന് ചുറ്റും.

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

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

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

ഹെറെഡോക്കിന്റെ ഘടനയെക്കുറിച്ചും അത് എങ്ങനെ പ്രവർത്തിക്കുന്നുവെന്നും ഇപ്പോൾ നമുക്കറിയാം, നമുക്ക് കുറച്ച് ഉദാഹരണങ്ങൾ നോക്കാം. ഞാൻ ഹെറെഡോക് ഉപയോഗിക്കുന്ന രണ്ട് പൊതു മേഖലകൾ എസ്എസ്എച്ച് വഴി കമാൻഡുകളുടെ ഒരു ബ്ലോക്ക് പ്രവർത്തിപ്പിക്കുകയും ഹെറെഡോക് വഴി SQL അന്വേഷണങ്ങൾ കൈമാറുകയും ചെയ്യുന്നു.

ചുവടെയുള്ള ഉദാഹരണത്തിൽ, ഞങ്ങൾ SSH വഴി റിമോട്ട് സെർവറിൽ ഒരു ബ്ലോക്ക് കോഡ് എക്സിക്യൂട്ട് ചെയ്യാൻ ശ്രമിക്കുന്നു.

ചുവടെയുള്ള ഉദാഹരണത്തിൽ, ഒരു ഡാറ്റാബേസിലേക്ക് കണക്റ്റുചെയ്uത് അന്വേഷണം പ്രവർത്തിപ്പിക്കുന്നതിന് ഞാൻ തിരഞ്ഞെടുത്ത ഒരു പ്രസ്താവന psql-ലേക്ക് കൈമാറുന്നു. .sql ഫയൽ പ്രവർത്തിപ്പിക്കുന്നതിന് -f ഫ്ലാഗ് ഉപയോഗിക്കുന്നതിന് പകരം ബാഷ് സ്ക്രിപ്റ്റിനുള്ളിൽ psql-ൽ ഒരു ചോദ്യം പ്രവർത്തിപ്പിക്കുന്നതിനുള്ള ഒരു ബദൽ മാർഗമാണിത്.

#!/usr/bin/env bash

UNAME=postgres
DBNAME=testing

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

ഈ ലേഖനത്തിന് അത്രയേയുള്ളൂ. ഞങ്ങൾ ഉദാഹരണങ്ങളിൽ കാണിച്ചിരിക്കുന്നതിനെ അപേക്ഷിച്ച് ഹെറെഡോക്ക് ഉപയോഗിച്ച് നിങ്ങൾക്ക് വളരെയധികം ചെയ്യാൻ കഴിയും. ഹെറെഡോക്ക് ഉപയോഗിച്ച് നിങ്ങൾക്ക് എന്തെങ്കിലും ഉപയോഗപ്രദമായ ഹാക്ക് ഉണ്ടെങ്കിൽ, ദയവായി അത് അഭിപ്രായ വിഭാഗത്തിൽ പോസ്റ്റുചെയ്യുക, അതുവഴി ഞങ്ങളുടെ വായനക്കാർക്ക് അതിൽ നിന്ന് പ്രയോജനം ലഭിക്കും.