আমরা ইতিমধ্যে লিনাক্স শেল স্ক্রিপ্টিং-একটি সিরিজ আর্টিকেল লিখেছি যা ওই সময়তে অনেক প্রশংসিত হয়েছিল এবং এখনও প্রাসঙ্গিক। শেল স্ক্রিপ্টিংয়ের আর্টিকেল সংগ্রহের লিংক এখানে দেওয়া হল।
- লিনাক্স শেল স্ক্রিপ্টিং শিখুন
এই আর্টিকেলে আমরা ভেরিয়েবল, এর এক্সিকিউশন এবং শেল স্ক্রিপ্টে এর ইমপ্লিমেন্টেশন নিয়ে আলোচনা করব।
আউটপুট সংরক্ষণ
একটি কমান্ডের আউটপুট স্ট্যান্ডার্ড আউটপুটে বা ফাইলে রিডায়রেক্ট করা যায় এবং ভেরিয়েবলে সংরক্ষণ করা যেতে পারে। যদি কমান্ডের আউটপুট অত্যধিক বড় হয় যাতে স্ক্রিনে ফিট না হয়, তবে আউটপুট ফাইলে বা ভেরিয়েবলে সংরক্ষণ ছাড়া অন্য বিকল্প নেই। ভেরিয়েবলে আউটপুট সংরক্ষণের একটি সুবিধা হল দ্রুত পরীক্ষার গতি। ভেরিয়েবল মেমরিতে সংরক্ষিত থাকে, তাই ফাইল থেকে রিট্রিভের চেয়ে এটি দ্রুত।
স্ক্রিপ্টিং ল্যাঙ্গুয়েজে ভেরিয়েবল
ভেরিয়েবল শেল স্ক্রিপ্টিংয়ে একটি গুরুত্বপূর্ণ উপাদান এবং বাশ কমান্ড Declare ব্যবহার করে ঘোষণা করা হয়। level নামে একটি ভেরিয়েবল ঘোষণা করতে, নিচের কমান্ডটি চালাতে হবে।
$ declare LEVEL
নোট: কর্ন শেল কম্প্যাটিবিলিটির জন্য typecast ব্যবহার করতে হবে, এটি একটি বিল্ট-ইন স্টেটমেন্ট। declare আরও উন্নত এবং সমস্ত বৈশিষ্ট্য ধারণ করে, তাই বাশ ব্যবহার করার সময় এটি সুপারিশ করা হয়।
নিয়মাবলী
- একটি ভেরিয়েবল নাম স্ক্রিপ্টে এর ব্যবহারকে যৌক্তিক করতে হবে।
- প্রোগ্রামে সর্বত্র একই ভেরিয়েবল নাম ব্যবহার করা দৃঢ়ভাবে পরামর্শ দেওয়া হয়।
- ভেরিয়েবল নাম আপারকেস বা লোয়ারকেস হতে পারে, কিন্তু কনভেনশন অনুযায়ী শেল কমান্ডগুলি লোয়ারকেসে থাকে, তাই বিভ্রান্তি দূর করতে ভেরিয়েবল নাম আপারকেসে ব্যবহার করা উচিত। যেমন: TOTAL_BILLED_AMOUNT, SELL_REPORT, ORDER_RECEIPT ইত্যাদি।
ইমপ্লিমেন্টেশন
একটি ভেরিয়েবলকে সমান চিহ্ন (=) ব্যবহার করে মান দেওয়া যায়। একটি ভেরিয়েবলে খালি স্ট্রিং অ্যাসাইন করতে সমান চিহ্নের পরে কোনো মান দিতে হবে না।
$ LEVEL =
LEVEL ভেরিয়েবলে সংরক্ষিত মান যাচাই করুন:
$ printf "%i" $LEVEL
printf হল একটি কমান্ড যেটি সি প্রোগ্রামাররা ভালোভাবে জানেন, এটি ডেটা প্রিন্ট করে। %i – ইন্টিজারকে প্রতীক করবে। প্রয়োজনে এটিকে ক্যারেক্টারের জন্য %c বা স্ট্রিংয়ের জন্য %s দিয়ে রিপ্লেস করা যায়।
$LEVEL: এখানে $ চিহ্নটি ভেরিয়েবল LEVEL-এর জন্য ভ্যালু সাবস্টিটিউটর হিসেবে কাজ করে।
নমুনা আউটপুট
$ printf "%i" $LEVEL 0
ভেরিয়েবলে একটি মান অ্যাসাইন করুন।
$ LEVEL=0
ভেরিয়েবলে সংরক্ষিত ডেটা যাচাই করুন।
$ printf "%i" $LEVEL 0
নোট: দুটি কেসেই আউটপুট ০ আসে – যখন ভেরিয়েবলে মান অ্যাসাইন করা হয়নি এবং যখন ০ মান অ্যাসাইন করা হয়। যদিও আউটপুট একই হলেও, শেল স্ক্রিপ্ট দুটি ভেরিয়েবল ঘোষণাকে ভিন্নভাবে হ্যান্ডেল করে।
ভেরিয়েবলে নতুন মান অ্যাসাইন করুন।
$ LEVEL=121
সংরক্ষিত ডেটা যাচাই করুন।
$ printf "%i" $LEVEL 121
একটি ভেরিয়েবল আনসেট করা
Declare একটি বাশ কমান্ড যা শুধু এক্সিকিউট হলে ভেরিয়েবল তৈরি করে। এটি তৈরি হওয়া ভেরিয়েবল স্ক্রিপ্ট বন্ধ না হওয়া পর্যন্ত বা ভেরিয়েবল নষ্ট না হওয়া পর্যন্ত মেমরিতে থাকে।
$ unset LEVEL
বাশে প্রিডিফাইনড ভেরিয়েবল
বাশে ৫০টিরও বেশি প্রিডিফাইনড ভেরিয়েবল রয়েছে। এগুলির কিছু বাশের জন্য বিশেষ অর্থ বহন করে, যেমন RANDOM ভেরিয়েবল একটি র্যান্ডম সংখ্যা আউটপুট দেয়। যদি এটি আনসেট করা হয়ে আবার ডিফাইন করা হয়, তবে মূল ভেরিয়েবলের মান Vĩnh 호ে যায়। তাই সিস্টেম-ডিফাইনড ভেরিয়েবল ব্যবহার না করার পরামর্শ দেওয়া হয়।
কিছু কার্যকর বাশ ভেরিয়েবলের তালিকা নিচে দেওয়া হল।
- BASH—বাশের ফুল পাথনেম।
- BASH_ENV—একটি শেল স্ক্রিপ্টে, স্ক্রিপ্ট শুরু হওয়ার আগে এক্সিকিউট হওয়া প্রোফাইল ফাইলের নাম।
- BASH_VERSION—বাশের সংস্করণ (যেমন 2.04.0(1)-release)।
- COLUMNS—আপনার ডিসপ্লে-এ প্রতি লাইনের ক্যারেক্টার সংখ্যা (যেমন 80)।
- HOSTNAME—কম্পিউটারের নাম।
- HOSTTYPE—কম্পিউটারের ধরন।
- HOME—আপনার হোম ডিরেক্টরির নাম।
- OSTYPE—অপারেটিং সিস্টেমের নাম।
- PATH—এক্সিকিউটেবল কমান্ড খুঁজে পেতে কলন-সেপারেটেড সার্চ পথের তালিকা।
- PPID—শেলের প্যারেন্ট প্রসেসের প্রসেস আইডি।
- PROMPT_COMMAND—PS1 প্রাইমারি প্রম্পট স্ট্রিং সেট করার আগে এক্সিকিউট হওয়া কমান্ড।
- PWD—বর্তমান ওয়ার্কিং ডিরেক্টরি (cd কমান্ড দ্বারা সেট)।
- RANDOM—প্রতিবার রেফারেন্স দেওয়া হলে ০ থেকে ৩২৭৬৭ পর্যন্ত একটি র্যান্ডম সংখ্যা রিটার্ন করে।
- SHELL—পছন্দের শেল; যেসব প্রোগ্রাম আপনার জন্য শেল শুরু করে।
- TERM—টার্মিনাল এমুলেশন টাইপ (যেমন console)।
শব্দ বিভাজনের নিয়ম।
$ LEVEL=0 $ printf "%i" $LEVEL 0 AND $ LEVEL=”0” $ printf "%i" $LEVEL 0
দুই কেসেই আউটপুট একই। তাহলে কোটেশন ব্যবহার করার ফলাফলে কী পার্থক্য?
আসুন ভিন্ন ভেরিয়েবল ডেটার সাথে একই পরীক্ষা করি।
$ LEVEL=0 ; 1 ; 2 ; 3 ; 4 ; 5 bash: 1: command not found bash: 2: command not found bash: 3: command not found bash: 4: command not found bash: 5: command not found
$ printf "%i" $LEVEL 0
উল্লেখ্য, আউটপুট সঠিক নয়। বাশ ০-এর পরের স্পেসকে টার্মিনেশন হিসেবে নিচ্ছে, তাই ভেরিয়েবলের মান ০ সেট হচ্ছে। এখন ভেরিয়েবলের জন্য কোটেশন ব্যবহার করি।
$ LEVEL=”0 ; 1 ; 2 ; 3 ; 4 ; 5” $ printf "%s" $LEVEL 0;1;2;3;4;5
আউটপুট এখনও সঠিক নয়। বাশ ভেরিয়েবল মান নিলো এবং মাঝপথের সব স্পেস সরিয়ে ফেললো। তাই printf ০,১,২,৩,৪,৫ কে আলাদা মান হিসেবে ইন্টারপ্রেট করতে পারলো না। সমাধান কী?
printf "%s" "$LEVEL" 0 ; 1 ; 2 ; 3 ; 4 ; 5
হ্যাঁ! ভেরিয়েবল সাবস্টিটিউশনকে কোটেশনের ভিতরে রাখাই সমাধান। কোটেশন শেলে ক্যারেক্টারগুলিকে গ্রুপ করে এবং স্পেশাল ক্যারেক্টারগুলিকে অর্থপূর্ণভাবে ইন্টারপ্রেট করে।
কোটেশন ব্যাক-টু-ব্যাক ব্যবহার করা যায় এবং ভেরিয়েবল সাবস্টিটিউশনকে কোটেশনের সাথে বাঁধা একটি ভালো অভ্যাস। 더불어 এটি সামগ্রিক টেক্সটকে কোটেশন থেকে আলাদা করতে ব্যবহার করা যায়। একটি উদাহরণ:
$ LEVEL=5 $ FLAG_MESSAGE="I HAVE CLEARED LEVEL""$LEVEL"". I Deserve appreciation." $ printf “%s” “$FLAG_MESSAGE”
“I HAVE CLEARED LEVEL5. I Deserve appreciation.”
কোটেড টেক্সটের টুকরো স্পেস দিয়ে আলাদা করলে উপরে আলোচিত সমস্যাটি হবে। বাশ হোয়াইটস্পেসকে টার্মিনেশন হিসেবে বিবেচনা করবে। ভেরিয়েবল সাবস্টিটিউশনের আরেকটি উপায়:
$ LEVEL=5 $ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation." $ printf “%s” "$FLAG_MESSAGE" “I HAVE CLEARED LEVEL 5. I Deserve appreciation.” সিঙ্গেল কোটেশন বাশকে স্পেশাল ক্যারেক্টার প্রিন্ট করতে বাধা দেয়।
$ printf “%s” '$FLAG_MESSAGE' “$FLAG_MESSAGE”
ব্যাকস্ল্যাশ (/)
ব্যাকস্ল্যাশ একটি ক্যারেক্টারের জন্য সিঙ্গেল কোটেশনের মতো কাজ করে। আপনি কি ভেবেছেন কীভাবে আপনি (“) প্রিন্ট করবেন?
$ printf "%c" "\""
যখন %q printf-এর সাথে গ্রুপ করা হয়, তবে প্রতিটি শব্দের পরে ব্যাকস্ল্যাশ দেয় যাতে শব্দের স্পেসিং নিশ্চিত হয়।
$ LEVEL=5 $ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation." $ printf “%q” "$FLAG_MESSAGE" “I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation.” আজ আপনার জন্য এতটুকুই। আমরা সর্বদা পাঠকদের জন্য উপযোগী আর্টিকেল দিতে চেষ্টা করি। উপরের আলোচ্য বিষয় বিশাল হওয়ায় বাকি টপিক্স উদাহরণসহ পরবর্তী আর্টিকেলে প্রকাশ করা হবে, যাতে থাকবে ‘ভেরিয়েবলের অ্যাট্রিবিউট’, ‘ভেরিয়েবল এক্সপোর্টিং’ ইত্যাদি।
তখন পর্যন্ত Tecmint.com-এর সাথে যুক্ত থাকুন এবং কমেন্ট সেকশনে আপনার মূল্যবান ফিডব্যাক দিন।