ট্র্যাক
/
Bash
Bash
/
সিলেবাস
/
হিয়ার ডকুমেন্ট
হি

হিয়ার ডকুমেন্ট মধ্যে Bash

{one: "১টি অনুশীলনী", 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 এই কনটেন্ট কমান্ডের স্ট্যান্ডার্ড ইনপুটের সাথে যুক্ত করে।
  • কমান্ডটি এই ইনপুট এমনভাবে প্রসেস করে যেন তা কীবোর্ড থেকে আসছে।

উদাহরণ ১: সাধারণ টেক্সট আউটপুট

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 তার পাওয়া কনটেন্ট আউটপুট করে।

উদাহরণ ২: wc (শব্দ গণনা)-এর সাথে ব্যবহার

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

আউটপুট:

3

এখানে wc -l লাইনের সংখ্যা গণনা করে। হেয়ারডক ইনপুট হিসেবে তিনটি লাইন সরবরাহ করে।

উদাহরণ ৩: একটি স্ক্রিপ্টে ডেটা পাঠানো

স্ক্রিপ্টটি:

#!/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-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে