ट्रैक
/
Bash
Bash
/
सिलेबस
/
हियर डॉक्युमेंट
हि

हियर डॉक्युमेंट में Bash

{one: "1 अभ्यास", other: "%{count} अभ्यास"}

हियर डॉक्युमेंट के बारे में

Bash स्क्रिप्टिंग में "हियर डॉक्युमेंट" (या "हियरडॉक") किसी कमांड या प्रोग्राम की ओर इनपुट की कई लाइनें मोड़ देता है, जैसे आप उन्हें सीधे टर्मिनल में टाइप कर रहे हों। अपनी स्क्रिप्ट के अंदर कई लाइनों वाला टेक्स्ट एम्बेड करने का यह एक शक्तिशाली टूल है, जिसके लिए बाहरी फाइलों या जटिल स्ट्रिंग मैनिपुलेशन की ज़रूरत नहीं पड़ती।

मुख्य विशेषताएँ और सिंटैक्स

  1. डेलिमिटर: हियरडॉक << ऑपरेटर से शुरू होता है, जिसके बाद एक डेलिमिटर शब्द आता है (इसे अक्सर "मार्कर" या "टर्मिनेटर" कहा जाता है)। यह डेलिमिटर आपका चुना हुआ कोई भी शब्द हो सकता है, लेकिन स्पष्टता के लिए आम तौर पर EOF, END या TEXT जैसा कुछ इस्तेमाल किया जाता है। ज़्यादा पढ़ने लायक कोड के लिए आप कोई वर्णनात्मक डेलिमिटर भी रख सकते हैं, जैसे END_INSTALLATION_INSTRUCTIONS।

  2. कंटेंट: शुरुआती << DELIMITER के बाद आप वह कंटेंट लिखते हैं जिसे आप भेजना चाहते हैं। यह टेक्स्ट, कोड या किसी और चीज़ की कई लाइनें हो सकती हैं।

  3. समाप्ति: हियरडॉक तब खत्म होता है जब डेलिमिटर शब्द फिर से अपनी अलग लाइन पर आ जाए, और उसके आगे या पीछे कोई व्हाइटस्पेस न हो।

बुनियादी सिंटैक्स

command << DELIMITER
  Content line 1
  Content line 2
  ...
  Content line N
DELIMITER

यह कैसे काम करता है

  • Bash शुरुआती << DELIMITER और अंतिम DELIMITER के बीच की सारी लाइनें पढ़ता है।
  • Bash इस कंटेंट को कमांड के स्टैंडर्ड इनपुट से जोड़ देता है।
  • कमांड इस इनपुट को इस तरह प्रोसेस करता है जैसे यह कीबोर्ड से आ रहा हो।

उदाहरण 1: साधारण टेक्स्ट आउटपुट

cat << EOF
This is the first line.
This is the second line.
This is the third line.
EOF

आउटपुट:

This is the first line.
This is the second line.
This is the third line.

इस उदाहरण में:

  • cat कमांड है।
  • << EOF हियरडॉक को EOF डेलिमिटर के साथ शुरू करता है।
  • टेक्स्ट की तीनों लाइनें कंटेंट हैं।
  • अपनी अलग लाइन पर लिखा EOF हियरडॉक को खत्म करता है।
  • इसके बाद cat जो कंटेंट उसे मिला, उसे आउटपुट करता है।

उदाहरण 2: wc (शब्द गणना) के साथ उपयोग

wc -l << END
Line 1
Line 2
Line 3
END

आउटपुट:

3

यहाँ wc -l लाइनों की संख्या गिनता है। हियरडॉक उन तीन लाइनों को इनपुट के रूप में देता है।

उदाहरण 3: स्क्रिप्ट को डेटा भेजना

स्क्रिप्ट:

#!/usr/bin/env bash

# Script to process input
while IFS= read -r line; do
  echo "Processing: $line"
done

इंटरैक्टिव bash प्रॉम्प्ट से हियरडॉक के साथ स्क्रिप्ट को कॉल कीजिए:

./your_script << MY_DATA
Item 1
Item 2
Item 3
MY_DATA

आउटपुट:

Processing: Item 1
Processing: Item 2
Processing: Item 3

भिन्न रूप और उन्नत विशेषताएँ

लिटरल कंटेंट

Bash हियरडॉक के अंदर वेरिएबल एक्सपैंशन, कमांड सब्स्टिट्यूशन और अरिथमेटिक एक्सपैंशन करता है। इस मायने में हियरडॉक डबल कोट स्ट्रिंग की तरह व्यवहार करते हैं।

cat << EOF
The value of HOME is $HOME
The current date is $(date)
Two plus two is $((2 + 2))
EOF

आउटपुट:

The value of HOME is /home/glennj
The current date is Thu Apr 24 13:47:32 EDT 2025
Two plus two is 4

जब डेलिमिटर को कोट किया जाता है (सिंगल या डबल कोट के साथ), तो ये एक्सपैंशन रुक जाते हैं। कंटेंट को जैसा है वैसा ही लिया जाता है। यह सिंगल कोट स्ट्रिंग की तरह है।

cat << 'EOF'
The value of $HOME is not expanded here.
The result of $(date) is not executed.
Two plus two is calculated by $((2 + 2))
EOF

आउटपुट:

The value of $HOME is not expanded here.
The result of $(date) is not executed.
Two plus two is calculated by $((2 + 2))

शुरुआत के टैब हटाना

अगर आप << की जगह <<- (अंत में हाइफन के साथ) इस्तेमाल करते हैं, तो Bash हियरडॉक की हर लाइन से शुरुआत के टैब अक्षर हटा देता है। यह आपकी स्क्रिप्ट में हियरडॉक के कंटेंट को इंडेंट करने के लिए काम का है, बिना आउटपुट पर असर डाले।

# Note, the leading whitespace is tab characters only, not spaces!
# The ending delimiter can have leading tabs as well.
cat <<- END
	This line has 1 leading tab.
	  This line has a leading tab and some spaces.
		This line 2 leading tabs.
	END

आउटपुट सारे शुरुआती टैब हटाकर छापा जाता है:

This line has 1 leading tab.
    This line has a leading tab and some spaces.
This line 2 leading tabs.
Caution

लेखक इस तरीके की सलाह नहीं देते। हालाँकि यह स्क्रिप्ट की पठनीयता बढ़ा सकता है,

  1. टैब अक्षरों की जगह गलती से स्पेस डाल देना आसान है (आपका एडिटर यह अपने आप कर सकता है), और
  2. स्पेस और टैब के फर्क को पहचानना मुश्किल होता है।

हियर डॉक्युमेंट का उपयोग कब करें

  • कई लाइनों वाला इनपुट: जब आपको किसी कमांड को टेक्स्ट की कई लाइनें देनी हों।
  • कॉन्फिगरेशन फाइलें: स्क्रिप्ट के अंदर कॉन्फिगरेशन के छोटे-छोटे टुकड़े एम्बेड करना।
  • कोड बनाना: स्क्रिप्ट के अंदर ही तुरंत कोड तैयार करना।
  • स्क्रिप्ट में इंटरैक्शन: इंटरैक्टिव प्रोग्रामों के लिए उपयोगकर्ता के इनपुट की नकल करना।
  • बाहरी फाइलों से बचना: जब आप अस्थायी फाइलें बनाने से बचना चाहते हों।

एक आम उपयोग यह हो सकता है कि आप कुछ मदद टेक्स्ट दें:

#!/usr/bin/env bash

usage() {
    cat << END_USAGE
Refresh database tables.

usage: ${0##*/} [-h|--help] [-A|--no-archive]

where: --no-archive flag will _skip_ the archive jobs
END_USAGE
}

# ... parsing command line options here ...

if [[ $flag_help == "true" ]]; then
  usage
  exit 0
fi

संभावित कमियाँ

  • बड़े एम्बेड किए गए डॉक्युमेंट आपके कोड को पढ़ना मुश्किल बना सकते हैं। बेहतर यह होगा कि आप अपनी स्क्रिप्ट को डॉक्युमेंटेशन अलग फाइलों में रखकर डिप्लॉय करें।
  • हियर डॉक्युमेंट कोड का बहाव तोड़ सकते हैं। हो सकता है आप कोड के किसी गहरे नेस्टेड हिस्से में हों और आपको किसी प्रोग्राम को कुछ टेक्स्ट भेजना हो। आस-पास के कोड के मुकाबले हियरडॉक का इंडेंटेशन अटपटा लग सकता है।

हियर स्ट्रिंग

हियर डॉक्युमेंट की तरह, हियर स्ट्रिंग (या "हियरस्ट्रिंग") भी किसी कमांड को इनपुट देती हैं। लेकिन जहाँ हियरडॉक टेक्स्ट के एक ब्लॉक के रूप में दिए जाते हैं, वहीं हियरस्ट्रिंग टेक्स्ट की एक ही स्ट्रिंग के रूप में दी जाती हैं। हियर स्ट्रिंग <<< "text" सिंटैक्स इस्तेमाल करती हैं।

tr 'a-z' 'A-Z' <<< "upper case this string"

आउटपुट:

UPPER CASE THIS STRING

हियरडॉक के उलट, इसमें कोई अंतिम डेलिमिटर देने की ज़रूरत नहीं होती।

हियर स्ट्रिंग क्यों इस्तेमाल करें?

हियर स्ट्रिंग की जगह पाइपलाइन भी इस्तेमाल की जा सकती है:

echo "upper case this string" | tr 'a-z' 'A-Z'

तो हियर स्ट्रिंग क्यों इस्तेमाल करें?

ऐसी स्थिति की सोचिए जहाँ आपको किसी लंबी चलने वाली गणना से आउटपुट के रूप में एक स्ट्रिंग मिलती है, और आप उस परिणाम को दो अलग-अलग कमांडों को देना चाहते हैं। पाइपलाइन इस्तेमाल करने पर आपको वह गणना दो बार चलानी पड़ती है:

some_long_running_calculation | first_command
some_long_running_calculation | second_command

एक ज़्यादा कुशल तरीका यह है कि आप गणना का आउटपुट पकड़ लें (कमांड सब्स्टिट्यूशन की मदद से), और फिर उन दोनों अगली कमांडों को इनपुट देने के लिए हियर स्ट्रिंग इस्तेमाल करें:

result=$( some_long_running_calculation )
first_command <<< "$result"
second_command <<< "$result"

वास्तविक जीवन में उस उदाहरण का एक उपयोग यह है:

  • किसी REST API क्वेरी (जो पेजों में बँटी है) के JSON रिस्पॉन्स को पकड़ना,
  • परिणामों को पार्स करने और उन्हें किसी फाइल में आउटपुट करने के लिए JSON डेटा एक jq प्रोग्राम को देना, और फिर
  • अगली क्वेरी का URL तय करने के लिए वही JSON डेटा दूसरे jq प्रोग्राम को देना।
# initialize the output CSV file
echo "ID,VALUE" > data.csv

url='https//example.com/api/query?page=1'

while true; do
  json=$( curl "$url" )

  # convert the results part of the response into CSV
  jq -r '.results[] | [.id, .value] | @csv' <<< "$json"

  # get the URL for the next page
  url=$( jq -r '.next_url // ""' <<< "$json" )
  if [[ "$url" == "" ]]; then
    break
  fi
done >> data.csv

आउटपुट रीडायरेक्शन की जगह पर ध्यान दीजिए। while लूप का सारा आउटपुट data.csv फाइल में जोड़ा जाएगा।

रीडायरेक्शन के रूप में हियरडॉक और हियरस्ट्रिंग

चूँकि ये रीडायरेक्शन के ही रूप हैं, इन्हें दूसरे रीडायरेक्शन ऑपरेशनों के साथ जोड़ा जा सकता है:

cat <<< END_OF_TEXT > output.txt
This is my important text.
END_OF_TEXT

awk '...' <<< "$my_var" >> result.csv

सारांश

हियर डॉक्युमेंट (या "हियरडॉक") Bash स्क्रिप्ट में कई लाइनों वाला इनपुट संभालने का एक लचीला और सुविधाजनक तरीका हैं। ये टेक्स्ट और डेटा को सीधे आपकी स्क्रिप्ट के अंदर एम्बेड करने की प्रक्रिया आसान बनाते हैं, जिससे स्क्रिप्ट ज़्यादा आत्मनिर्भर और पढ़ने में आसान हो जाती हैं।

हियर स्ट्रिंग (या "हियरस्ट्रिंग") हियर डॉक्युमेंट की तरह हैं, लेकिन ज़्यादा सरल और लचीला सिंटैक्स देती हैं।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।