এই আর্টিকেলটি বাশ স্ক্রিপ্টে while loop ব্যবহার করে ফাইল পড়ার সবকিছু নিয়ে। ফাইল পড়া প্রোগ্রামিং-এ একটি সাধারণ অপারেশন। আপনার বিভিন্ন মেথড এবং কোন মেথড বেশি ইফিশিয়েন্ট সেটি সম্পর্কে জানা উচিত। Bash-এ একটি টাস্ক অনেকভাবে করা যায় কিন্তু সবসময় একটি অপ্টিমাল পথ থাকে এবং আমাদের সেটি ফলো করা উচিত।
while loop দিয়ে ফাইল কন্টেন্ট পড়ার আগে while loop কীভাবে কাজ করে সেটি সংক্ষেপে জানি। While loop একটি কন্ডিশন ইভ্যালুয়েট করে এবং কন্ডিশন true হলে কোড সেটের ওভার ইটারেট করে।
while [ CONDITION ] do code block done
while loop সিনট্যাক্স ভেঙে দেখা যাক:
- while loop while কিওয়ার্ড দিয়ে শুরু হয় এবং একটি কন্ডিশন থাকে।
- এক condition [ ] বা [[ ]] এর ভিতরে থাকা উচিত। কন্ডিশন সবসময় true রিটার্ন করতে হবে লুপ এক্সিকিউট হওয়ার জন্য।
- আসলে কোড ব্লক do এবং done-র মাঝে রাখা হয়।
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
echo " Welcome ${NUMBER} times "
(( NUMBER++ ))
done
এটি একটি খুব সিম্পল উদাহরণ, যেখানে loop এক্সিকিউট হয় যতক্ষণ NUMBER ১০ এর চেয়ে বেশি নয় এবং echo স্টেটমেন্ট প্রিন্ট করে।
while-এর সাথে read কমান্ড ব্যবহার করব ফাইল কন্টেন্ট লাইন বাই লাইন পড়তে। নিচে while এবং read কমান্ড কম্বাইন করার সিনট্যাক্স। এখন ফাইল ইনপুট হিসেবে পাস করার বিভিন্ন উপায় আছে এবং আমরা সব দেখব।
# SYNTAX while read VARIABLE do code done
লিনাক্সে পাইপিং
সাধারণত টার্মিনাল থেকে ফাইল কন্টেন্ট দেখতে cat command ব্যবহার করি। এছাড়া cat command-এর আউটপুট অন্য কমান্ডে (grep, sort ইত্যাদি) পাইপ করি।
একইভাবে, এখানে cat command ব্যবহার করব ফাইল কন্টেন্ট পড়তে এবং while লুপে পাইপ করব। ডেমোনের জন্য আমি /etc/passwd ফাইল ব্যবহার করছি কিন্তু এই ফাইলসঙ্গে ছেড়াখানি করা উচিত নয়, তাই এই ফাইলটির ব্যাকআপ কপি নিয়ে খেলুন যদি ইচ্ছা হয়।
cat /etc/passwd | while read LREAD
do
echo ${LREAD}
done
উপরের কোড সাবমিট করলে কী হবে সেটি ভেঙে দেখা যাক:
- cat /etc/passwd ফাইল কন্টেন্ট পড়ে পাইপ থ্রু ইনপুট হিসেবে পাস করবে।
- read কমান্ড cat কমান্ড থেকে পাস করা ইনপুটের প্রতিটি লাইন পড়ে LREAD ভেরিয়েবলে স্টোর করবে।
- read কমান্ড ফাইল কন্টেন্ট পড়বে যতক্ষণ না EOL ইন্টারপ্রেট হয়।
আপনি head, tail মত অন্যান্য কমান্ডও ব্যবহার করতে পারেন এবং while লুপে পাইপ করতে পারেন।
head -n 5 /etc/passwd | while read LREAD
do
echo ${LREAD}
done
লিনাক্সে ইনপুট রিডাইরেকশন
ইনপুট রিডাইরেকশন অপারেটর (<) ব্যবহার করে ফাইল কন্টেন্ট while loop-এ রিডাইরেক্ট করতে পারি।
while read LREAD
do
echo ${LREAD}
done < /etc/passwd | head -n 5
আপনি ফাইলনেম একটি ভেরিয়েবলে স্টোর করে রিডাইরেকশন অপারেটর থ্রু পাস করতে পারেন।
FILENAME="/etc/passwd"
while read LREAD
do
echo ${LREAD}
done < ${FILENAME}
আপনি স্ক্রিপ্টে আর্গুমেন্ট হিসেবে ফাইলনেম পাস করতে পারেন।
while read LREAD
do
echo ${LREAD}
done < $1 | head -n 5
ইন্টারন্যাল ফিল্ড সেপারেটর (IFS)
আপনি ভিন্ন টাইপের ফাইল ফরম্যাট (CSV, TXT, JSON) নিয়ে কাজ করতে পারেন এবং ফাইল কন্টেন্ট কাস্টম ডিলিমিটার অনুযায়ী স্প্লিট করতে চাইতে পারেন। এই ক্ষেত্রে আপনি “Internal field separator (IFS)” ব্যবহার করতে পারেন ফাইল কন্টেন্ট স্প্লিট করে ভেরিয়েবলে স্টোর করতে।
দেখি কীভাবে কাজ করে। /etc/passwd ফাইলটি কোলন (:) হিসেবে ডিলিমিটার রেখেছে। আপনি এখন প্রতিটি লাইন থেকে শব্দগুলো স্প্লিট করে আলাদা ভেরিয়েবলে স্টোর করতে পারেন।
নিচের উদাহরণে, আমি /etc/passwd ফাইলটি কোলন দিয়ে সেপারেটর হিসেবে স্প্লিট করছি এবং প্রতিটি স্প্লিট আলাদা ভেরিয়েবলে স্টোর করছি।
while IFS=":" read A B C D E F G
do
echo ${A}
echo ${B}
echo ${C}
echo ${D}
echo ${E}
echo ${F}
echo ${G}
done < /etc/passwd
স্ক্রিনশট সাইজ বিবেচনা করে শুধু এক লাইন স্প্লিট দেখানো হয়েছে।
লিনাক্সে খালি লাইন
ফাইল কন্টেন্ট দিয়ে loop চালালে খালি লাইন ইগনোর হয় না। এটি демонস্ট্রেট করার জন্য আমি নিচের কন্টেন্ট দিয়ে একটি স্যাম্পল ফাইল তৈরি করেছি। ৪টি লাইন এবং কিছু খালি লাইন, লিডিং হোয়াইটস্পেস, ট্রেইলিং হোয়াইটস্পেস, লাইন ২-এ ট্যাব ক্যারেক্টার, এবং কিছু 이스cape ক্যারেক্টার (\n এবং \t) আছে।
while read LREAD
do
echo ${LREAD}
done < testfile
রেজাল্ট দেখুন, ব্ল্যাঙ্ক লাইন ইগনোর হয়নি। আর একটি আকর্ষণীয় বিষয় হলো read কমান্ড কীভাবে হোয়াইটস্পেস ট্রিম করে। ফাইল কন্টেন্ট পড়ার সময় ব্ল্যাঙ্ক লাইন ইগনোর করার একটি সিম্পল উপায় হলো টেস্ট অপারেটর -z ফ্ল্যাগ ব্যবহার করা যা চেক করে স্ট্রিং দৈর্ঘ্য শূন্য কিনা। এখন একই উদাহরণ রিপিট করি কিন্তু এইবার টেস্ট অপারেটরসহ।
while read LREAD
do
if [[ ! -z $LREAD ]]
then
echo ${LREAD}
fi
done < testfile
আউটপুট থেকে দেখতে পাচ্ছেন খালি লাইনগুলো ইগনোর হয়েছে।
এস্কেপ ক্যারেক্টার
\n, \t, \c মত escapar ক্যারেক্টার ফাইল পড়ার সময় প্রিন্ট হয় না। এটি демонস্ট্রেট করতে আমি একই স্যাম্পল ফাইল ব্যবহার করছি যেটিতে কিছু escapar ক্যারেক্টার আছে।
while read LREAD
do
echo ${LREAD}
done < testfile
আউটপুট থেকে দেখতে পাচ্ছেন escapar ক্যারেক্টার তাদের মেনিং হারিয়ে গেছে এবং শুধু n এবং t প্রিন্ট হয়েছে \n এবং \t-র বদলে। ব্যাকস্ল্যাশ ইন্টারপ্রিটেশন রোধ করতে -r ব্যবহার করতে পারেন।
while read -r LREAD
do
echo ${LREAD}
done < testfile
এই আর্টিকেলের জন্য এতটুকু। আপনার যেকোনো ফিডব্যাক বা টিপস থাকলে আমাদের জানাতে পারেন। আপনার ফিডব্যাকই আমাদের আরও ভালো কন্টেন্ট তৈরি করতে সাহায্য করে। পড়তে থাকুন এবং সমর্থন করুন।