Bash স্ক্রিপ্টিংয়ে একটি "হেয়ার ডকুমেন্ট" (বা "হেয়ারডক") একাধিক লাইনের ইনপুট একটি কমান্ড বা প্রোগ্রামে রিডাইরেক্ট করে, যেন আপনি সেগুলো সরাসরি টার্মিনালে টাইপ করছেন। বাইরের ফাইল বা জটিল স্ট্রিং ম্যানিপুলেশন ছাড়াই আপনার স্ক্রিপ্টের ভেতরে একাধিক লাইনের টেক্সট বসানোর জন্য এটি একটি শক্তিশালী টুল।
ডেলিমিটার: একটি হেয়ারডক শুরু হয় << অপারেটর দিয়ে, তারপর আসে একটি ডেলিমিটার শব্দ (যাকে প্রায়ই "মার্কার" বা "টার্মিনেটর" বলা হয়)।
এই ডেলিমিটার আপনার পছন্দের যেকোনো শব্দ হতে পারে, তবে স্পষ্টতার জন্য EOF, END বা TEXT-এর মতো কিছু ব্যবহার করা সাধারণ ব্যাপার।
আরও পাঠযোগ্য কোডের জন্য আপনি ডেলিমিটার হিসেবে বর্ণনামূলক কিছু ব্যবহার করতে পারেন, যেমন END_INSTALLATION_INSTRUCTIONS।
কনটেন্ট: শুরুর << DELIMITER-এর পরে আপনি যে কনটেন্ট রিডাইরেক্ট করতে চান তা লিখবেন।
এটি একাধিক লাইনের টেক্সট, কোড বা অন্য যেকোনো কিছু হতে পারে।
সমাপ্তি: ডেলিমিটার শব্দটি যখন আবার নিজে একা একটি লাইনে দেখা যায়, সামনে বা পিছনে কোনো হোয়াইটস্পেস ছাড়া, তখন হেয়ারডক শেষ হয়।
command << DELIMITER
Content line 1
Content line 2
...
Content line N
DELIMITER
<< DELIMITER আর শেষের DELIMITER-এর মধ্যবর্তী সব লাইন পড়ে।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 -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.
লেখক এই ব্যবহার সুপারিশ করেন না। যদিও এটি স্ক্রিপ্টের পাঠযোগ্যতা বাড়াতে পারে,
একটি সাধারণ ব্যবহার হতে পারে কিছু হেল্প টেক্সট দেওয়া:
#!/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"
এই উদাহরণের একটি বাস্তব-জগতের প্রয়োগ এখানে:
# 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 স্ক্রিপ্টে একাধিক লাইনের ইনপুট সামলানোর একটি নমনীয় ও সুবিধাজনক উপায়। এগুলো আপনার স্ক্রিপ্টের ভেতরে সরাসরি টেক্সট ও ডেটা বসানোর প্রক্রিয়া সহজ করে, ফলে স্ক্রিপ্টগুলো আরও স্বনির্ভর ও পড়তে সহজ হয়।
হেয়ার স্ট্রিং (বা "হেয়ারস্ট্রিং") হেয়ার ডকুমেন্টের মতোই, তবে আরও সরল ও গতিশীল সিনট্যাক্স দেয়।