কম্পিউটার টিউটোরিয়াল

ব্যাশ স্ক্রিপ্টিং নিপুণতা: সিনট্যাক্স, টুলস এবং সেরা অনুশীলন

একটি শেল হল অপারেটিং সিস্টেমের জন্য কমান্ড ইন্টারপ্রিটার। ব্যাশ আমার প্রিয় শেল, কিন্তু প্রতিটি লিনাক্স শেল ব্যবহারকারী বা সিস্টেম অ্যাডমিন দ্বারা টাইপ করা কমান্ডগুলাকে অপারেটিং সিস্টেম যাতে ব্যবহার করতে পারে সেরূপে রূপান্তর করে। ফলাফলগুলো শেল প্রোগ্রামে ফিরে আসার সময়, সেগুলো STDOUT-এ পাঠায় যা ডিফল্টরূপে টার্মিনালে প্রদর্শিত হয়। আমি जितने শেল জানি, সেগুলো প্রোগ্রামিং ভাষাও।

ট্যাব কমপ্লিশন, কমান্ড-লাইন রিক্যাল এবং এডিটিং, এবং অ্যালিয়াসের মতো শর্টকাট ফিচারগুলো এটিকে একটি শক্তিশালী শেল বানায়। এর ডিফল্ট কমান্ড-লাইন এডিটিং মোড Emacs ব্যবহার করে, কিন্তু আমার প্রিয় ব্যাশ ফিচারগুলো থেকে একটি হল আমি এটিকে Vi মোডে পরিবর্তন করতে পারি যাতে আমার মসেল মেমরির অংশ যেসব এডিটিং কমান্ড সেগুলো ব্যবহার করতে পারি।

যদি আপনি ব্যাশকে শুধু একটি শেল মনে করেন, তবে আপনি এর আসল শক্তির অনেক অংশ মিস করছেন। আমার তিন-খণ্ডের লিনাক্স সেলফ-স্টাডি কোর্স (যে এই আর্টিকেল সিরিজের ভিত্তি) রিসার্চ করার সময়, আমি ব্যাশ সম্পর্কে এমন কিছু জানলাম যা ২০ বছরের লিনাক্স কাজের মাঝেও জানতাম না। এই নতুন জ্ঞানগুলির কিছু ব্যাশকে একটি প্রোগ্রামিং ভাষা হিসেবে ব্যবহারের সাথে সম্পর্কিত। ব্যাশ একটি শক্তিশালী প্রোগ্রামিং ভাষা, যা কমান্ড লাইন এবং শেল স্ক্রিপ্টে ব্যবহারের জন্য আদর্শভাবে ডিজাইন করা হয়েছে।

এই তিন-অংশের সিরিজ কমান্ড-লাইন ইন্টারফেস (সিএলআই) প্রোগ্রামিং ভাষা হিসেবে ব্যাশ ব্যবহার অন্বেষণ করে। এই প্রথম আর্টিকেলে ব্যাশের সাথে সহজ কমান্ড-লাইন প্রোগ্রামিং, ভেরিয়েবল, এবং কন্ট্রোল অপারেটর নিয়ে আলোচনা করা হয়েছে। পরের আর্টিকেলগুলো ব্যাশ ফাইল প্রকার; স্ট্রিং, সংখ্যাসূচক, এবং বিবিধ লজিক্যাল অপারেটর যা এক্সিকিউশন-ফ্লো কন্ট্রোল লজিক প্রদান করে; বিভিন্ন ধরণের শেল এক্সপ্যানশন; এবং for, while, এবং until লুপ যা পুনরাবৃত্তি অপারেশন সক্ষম করে। এছাড়া এই টুলসকে সহজ এবং সমর্থন করার কিছু কমান্ডও দেখা হবে।

শেল

একটি শেল হল অপারেটিং সিস্টেমের জন্য কমান্ড ইন্টারপ্রিটার। ব্যাশ আমার প্রিয় শেল, কিন্তু প্রতিটি লিনাক্স শেল ব্যবহারকারী বা সিস্টেম অ্যাডমিন দ্বারা টাইপ করা কমান্ডগুলাকে অপারেটিং সিস্টেম যাতে ব্যবহার করতে পারে সেরূপে রূপান্তর করে। ফলাফলগুলো শেল প্রোগ্রামে ফিরে আসার সময়, সেগুলো টার্মিনালে প্রদর্শিত হয়। আমি जितने শেল জানি, সেগুলো প্রোগ্রামিং ভাষাও।

ব্যাশ stood for Bourne Again Shell কারণ ব্যাশ শেল পুরনো বোর্ন শেলের ওপর ভিত্তি করে তৈরি যা ১৯৭৭ সালে স্টিভেন বোর্ন লিখেছিলেন। অন্যান্য অনেক শেল উপলব্ধ, কিন্তু আমি যেসব শেল সবচেয়ে বেশি এনকাউন্টার করি সেগুলো হল:

  • csh: C প্রোগ্রামারদের জন্য C ভাষার সিনট্যাক্স পছন্দ করলে C শেল
  • ksh: ডেভিড কর্ন লিখিত কর্ন শেল, ইউনিক্স ব্যবহারকারীদের মধ্যে জনপ্রিয়
  • tcsh: আরও ইউজার-ফ্রেন্ডলি ফিচারসহ csh-এর একটি ভার্সন
  • zsh: Z শেল, যা অন্যান্য জনপ্রিয় শেলের অনেক ফিচার কম্বাইন করে

সব শেলের বিল্ট-ইন কমান্ড থাকে যা কোর ইউটিলিটিগুলো পূরক বা রিপ্লেস করে। শেলের ম্যান পেজ খুলুন এবং "BUILT-INS" সেকশন খুঁজুন যাতে সেটি যা কমান্ডগুলো প্রদান করে তা দেখতে পান।

প্রতিটি শেলের নিজস্ব ব্যক্তিত্ব এবং সিনট্যাক্স আছে। কিছু অন्यों চেয়ে আপনার জন্য ভালো কাজ করবে। আমি C শেল, কর্ন শেল, এবং Z শেল ব্যবহার করেছি। আমি এখনও অন্যগুলোর চেয়ে ব্যাশ শেলই বেশি পছন্দ করি। যেটি আপনার জন্য সবচেয়ে ভালো কাজ করে সেটি ব্যবহার করুন, যদিও এর জন্য অন্যগুলো ট্রাই করতে হতে পারে। خوشব-random, শেল পরিবর্তন করা খুব সহজ।

এই সব শেল প্রোগ্রামিং ভাষাও, কমান্ড ইন্টারপ্রিটার হওয়ার পাশাপাশি। এখানে কিছু প্রোগ্রামিং কনস্ট্রাক্ট এবং টুলের দ্রুত 둘러না দেওয়া হলো যা ব্যাশের অভিন্ন অংশ।

প্রোগ্রামিং ভাষা হিসেবে ব্যাশ

বেশিরভাগ সিস্টেম অ্যাডমিন ব্যাশ ব্যবহার করে কমান্ড ইস্যু করতে, যা সাধারণত খুব সহজ এবং সরল। কিন্তু ব্যাশ একক কমান্ড দিয়ে দিয়ে যেতে পারে, এবং অনেক সিস্টেম অ্যাডমিন সাধারণ সিএলআই প্রোগ্রাম তৈরি করে কাজের একটি সিরিজ সম্পাদন করতে। এই প্রোগ্রামগুলো সাধারণ টুলস যা সময় এবং পরিশ্রম বাঁচায়।

সিএলআই প্রোগ্রাম লিখার আমার উদ্দেশ্য হল সময় এবং পরিশ্রম বাঁচানো (অর্থাৎ, লেজি সিস্টেম অ্যাডমিন বানানো)। সিএলআই প্রোগ্রাম এটি সাপোর্ট করে কারণ এতে অনেক কমান্ড একটি নির্দিষ্ট ক্রমে লিস্টেড থাকে যা একে অপর এক্সিকিউট হয়, তাই আপনাকে এক কমান্ডের প্রগতি দেখে পরবর্তী কমান্ড টাইপ করার জন্য অপেক্ষা করতে হয় না। আপনি অন্য কাজ করতে পারেন এবং প্রতিটি কমান্ডের প্রগতি folyam নির্দারণ করতে হয় না।

"একটি প্রোগ্রাম" কী?

ফ্রি অন-লাইন ডিকশনারি অফ কম্পিউটিং (FOLDOC) প্রোগ্রামকে সংজ্ঞায়িত করে: "কম্পিউটার দ্বারা এক্সিকিউট হওয়া ইনস্ট্রাকশন, সেগুলো যেসبه ডিভাইসে রান করে তার বিপরীতে।" প্রিন্সটন বিশ্ববিদ্যালয়ের WordNet প্রোগ্রামকে সংজ্ঞায়িত করে: "…ইনস্ট্রাকশনের একটি সিকোয়েন্স যা একটি কম্পিউটার ইন্টারপ্রেট এবং এক্সিকিউট করতে পারে…" উইকিপিডিয়াতেও কম্পিউটার প্রোগ্রাম সম্পর্কে ভালো একটি এন্ট্রি আছে।

অতএব, একটি প্রোগ্রাম এক বা একাধিক ইনস্ট্রাকশন থেকে oluşতে পারে যা একটি নির্দিষ্ট, সম্পর্কিত টাস্ক সম্পাদন করে। একটি কম্পিউটার প্রোগ্রাম ইনস্ট্রাকশনকে প্রোগ্রাম স্টেটমেন্টও বলা হয়। সিস্টেম অ্যাডমিনদের জন্য, একটি প্রোগ্রাম সাধারণত শেল কমান্ডের একটি সিকোয়েন্স। লিনাক্সের জন্য উপলব্ধ সব শেল, কমপক্ষে যেগুলো আমি জানি, কমপক্ষে প্রোগ্রামিং ক্যাপাবিলিটির বেসিক ফর্ম আছে, এবং অধিকাংশ লিনাক্স ডিস্ট্রিবিউশনের ডিফল্ট শেল olan ব্যাশ তার ব্যতিক্রম নয়।

যদিও এই সিরিজে ব্যাশ ব্যবহার করা হয়েছে (কারণ এটি सर्वব্যাপী), আপনি যদি অন্য শেল ব্যবহার করেন, সাধারণ প্রোগ্রামিং কনসেপ্টগুলো একই থাকবে, যদিও কনস্ট্রাক্ট এবং সিনট্যাক্স কিছুটা আলাদা হতে পারে। কিছু শেল কিছু ফিচার সাপোর্ট করতে পারে যা অন্যগুলো নাও করে, কিন্তু সবই কিছুটা প্রোগ্রামিং ক্যাপাবিলিটি প্রদান করে। শেল প্রোগ্রামগুলো повтор ব্যবহার করার জন্য একটি ফাইলে সংরক্ষিত হতে পারে, বা প্রয়োজন অনুযায়ী কমান্ড লাইনে তৈরি করা যায়।

সহজ সিএলআই প্রোগ্রাম

সবচেয়ে সহজ কমান্ড-লাইন প্রোগ্রামগুলো হল এক বা দুটি ক্রমাগত প্রোগ্রাম স্টেটমেন্ট, যা একসাথে বা আলাদা হতে পারে, এন্টার কী প্রেস করার আগে কমান্ড লাইনে লিখা হয়। একটি প্রোগ্রামের দ্বিতীয় স্টেটমেন্ট, যদি থাকে, প্রথমটির অ্যাকশনের ওপর ডিপেন্ডেন্ট হতে পারে, কিন্তু এটাকে ডিপেন্ডেন্ট হতে হবে না।

একটি সিনট্যাক্টিক্যাল পাঙ্কচুয়েশন স্পষ্টভাবে বলা দরকার। কমান্ড লাইনে একটি একক কমান্ড লিখার সময়, এন্টার কী প্রেস করলে কমান্ডটি একটি ইমপ্লিসিট সেমিকোলন (;) দিয়ে টার্মিনেট হয়। যখন একটি সিএলআই শেল প্রোগ্রাম কমান্ড লাইনে একক লাইন হিসেবে লিখা হয়, সেমিকোলন অবশ্যই প্রতিটি স্টেটমেন্ট টার্মিনেট করতে এবং পরবর্তীটির থেকে আলাদা করতে ব্যবহার করতে হয়। সিএলআই শেল প্রোগ্রামের শেষ স্টেটমেন্ট এক্সপ্লিসিট বা ইমপ্লিসিট সেমিকোলন ব্যবহার করতে পারে।

কিছু বেসিক সিনট্যাক্স

নিচের উদাহরণগুলো এই সিনট্যাক্স স্পষ্ট করবে। এই প্রোগ্রামটি একটি একক কমান্ড যা একটি এক্সপ্লিসিট টার্মিনেটর দিয়ে:

[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.

এটা হয়তো একটি প্রোগ্রামের মতো না লাগে, কিন্তু প্রতিটি নতুন প্রোগ্রামিং ভাষা শিখার সময় আমি যেটি প্রথমে এনকাউন্টার করি সেটি এটিই। সিনট্যাক্স প্রতিটি ভাষার জন্য কিছুটা আলাদা হতে পারে, কিন্তু ফলাফল একই।

এই তुच্ছ কিন্তু সর্বব্যাপী প্রোগ্রামটিতে কিছু এক্সপ্যান্ড করি। আপনার ফলাফল আমার থেকে ভিন্ন হবে কারণ আমি অন্যান্য এক্সপেরিমেন্ট করেছি, কিন্তু আপনি হয়তো শুধু ডিফল্ট ডিরেক্টরি এবং ফাইলগুলো আছে যেগুলো একাউন্ট হোম ডিরেক্টরিতে প্রথমবার GUI ডেস্কটপের মাধ্যমে লগইন করলে তৈরি হয়।

[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25 TestFile1.Linux dmesg2.txt Downloads newfile.txt softlink1 testdir6
chapter26 TestFile1.mac dmesg3.txt file005 Pictures Templates testdir
TestFile1 Desktop dmesg.txt link3 Public testdir Videos
TestFile1.dos dmesg1.txt Documents Music random.txt testdir1

এটা কিছুটা অর্থবহ। ফলাফলগুলো সম্পর্কিত, কিন্তু আশুল individidual প্রোগ্রাম স্টেটমেন্টগুলো একে অপর থেকে স্বতন্ত্র। লক্ষ্য করুন আমি সেমিকোলনের আগে এবং পরে স্পেস রাখতে পছন্দ করি কারণ এতে কোড কিছুটা সহজে পড়া যায়। সেই ছোট সিএলআই প্রোগ্রামটি আবার চেষ্টা করুন এন্ডে এক্সপ্লিসিট সেমিকোলন ছাড়া:

[student@studentvm1 ~]$ echo "My home directory." ; ls 

আউটপুটে কোনো পার্থক্য নেই।

ভেরিয়েবল সম্পর্কে কিছু

সকল প্রোগ্রামিং ভাষার মতো, ব্যাশ শেলও ভেরিয়েবল হ্যান্ডেল করতে পারে। একটি ভেরিয়েবল হল একটি সিম্বোলিক নাম যা মেমোরির একটি নির্দিষ্ট লোকেশনকে রেফার করে যেটি কোনো একটি ভ্যালু ধারণ করে। একটি ভেরিয়েবলের ভ্যালু পরিবর্তনশীল, অর্থাৎ এটি variable।

ব্যাশ C এবং সম্পর্কিত ভাষার মতো ভেরিয়েবল টাইপ করে না, সেগুলোকে ইন্টিজার, ফ্লোটিং পয়েন্ট, বা স্ট্রিং টাইপ হিসেবে ডিফাইন করে না। ব্যাশে, সব ভেরিয়েবল স্ট্রিং। একটি স্ট্রিং যা একটি ইন্টিজার হয়, সেটি ইন্টিজার অ্যারিথমেটিক্সে ব্যবহার করা যায়, যা একমাত্র ম্যাথের টাইপ যা ব্যাশ করতে পারে। আরও জটিল ম্যাথের জন্য, bc কমান্ড সিএলআই প্রোগ্রাম এবং স্ক্রিপ্টে ব্যবহার করা যায়।

ভেরিয়েবলগুলো ভ্যালু অ্যাসাইন করা হয় এবং সিএলআই প্রোগ্রাম এবং স্ক্রিপ্টে সেই ভ্যালুগুলোকে রেফার করতে ব্যবহার করা হয়। একটি ভেরিয়েবলের ভ্যালু সেট করা হয় এর নাম দিয়ে কিন্তু $ সাইন ছাড়া। অ্যাসাইনমেন্ট VAR=10 ভেরিয়েবল VAR-এর ভ্যালু ১০ সেট করে। ভেরিয়েবলের ভ্যালু প্রিন্ট করতে, আপনি স্টেটমেন্ট echo $VAR ব্যবহার করতে পারেন। টেক্সট (অর্থাৎ নন-নিউমেরিক) ভেরিয়েবল দিয়ে শুরু করুন।

ব্যাশ ভেরিয়েবলগুলো শেল এনভায়রনমেন্টের অংশ হয়ে যায় যতক্ষণ না সেগুলো আনসেট করা হয়।

একটি ভেরিয়েবলের ইনিশিয়াল ভ্যালু চেক করুন যেটি অ্যাসাইন করা হয়নি; এটি নাল হওয়া উচিত। তারপর ভেরিয়েবলে একটি ভ্যালু অ্যাসাইন করুন এবং প্রিন্ট করুন যেন এর ভ্যালু ভেরিফাই হয়। আপনি এটা সব একসাথে একটি সিএলআই প্রোগ্রামে করতে পারেন:

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;

Hello World
[student@studentvm1 ~]$

নোট: ভেরিয়েবল অ্যাসাইনমেন্টের সিনট্যাক্স খুব স্ট্রিক্ট। অ্যাসাইনমেন্ট স্টেটমেন্টে ইকোয়াল (=) সাইনের দুপাশে কোনো স্পেস থাকতে পারবে না।

খালি লাইনটি ইঙ্গিত দেয় যে MyVar-এর ইনিশিয়াল ভ্যালু নাল। একটি ভেরিয়েবলের ভ্যালু পরিবর্তন করা এবং সেট করা একইভাবে হয়। এই উদাহরণে মূল এবং নতুন উভয় ভ্যালু দেখানো হয়েছে।

উল্লেখ্য, ব্যাশ ইন্টিজার অ্যারিথমেটিক্যাল ক্যালকুলেশন পারফর্ম করতে পারে, যা একটি অ্যারেতে একটি এলিমেন্টের লোকেশনের রেফারেন্স ক্যালকুলেট করতে বা সহজ ম্যাথ প্রাবলেম সমাধান করতে উপকারী। এটি সায়েন্টিফিক কম্পিউটিং বা ডেসিম্যাল প্রয়োজন যেসব কাজের জন্য উপযুক্ত নয়, যেমন ফিন্যান্সিয়াল ক্যালকুলেশন। সেই ধরনের ক্যালকুলেশনের জন্য অনেক ভালো টুলস আছে।

এখানে একটি সহজ ক্যালকুলেশন:

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63

যখন আপনি একটি ম্যাথ অপারেশন পারফর্ম করেন যা ফ্লোটিং-পয়েন্ট সংখ্যা ফলাফল দেয়?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$

ফলাফলটি নিকটতম ইন্টিজার। লক্ষ্য করুন ক্যালকুলেশনটি echo স্টেটমেন্টের অংশ হিসেবে পারফর্ম হয়েছে। ম্যাথটি enclosing echo কমান্ডের আগে পারফর্ম হয়েছে ব্যাশের order of precedence-র কারণে। বিস্তারিত জানতে ব্যাশ ম্যান পেজ দেখুন এবং "precedence" সার্চ করুন।

কন্ট্রোল অপারেটর

শেল কন্ট্রোল অপারেটরগুলোর মধ্যে একটি যা সহজে কিছু আকর্ষণীয় কমান্ড-লাইন প্রোগ্রাম তৈরি করতে সাহায্য করে। সিএলআই প্রোগ্রামের সবচেয়ে সহজ ফর্ম হল কয়েকটি কমান্ড একসাথে কমান্ড লাইনে সিকোয়েন্সে বাঁধা:

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

সেগুলো কোনো সমস্যা ছাড়া চলে যতক্ষণ না কোনো এরর হয়। কিন্তু কোনো এরর হলে কী হয়? আপনি বিল্ট-ইন && এবং || ব্যাশ কন্ট্রোল অপারেটর ব্যবহার করে এররها আগাম করার চেষ্টা করতে পারেন এবং সেগুলোর অনুমতি দিতে পারেন। এই দুটি কন্ট্রোল অপারেটর কিছু ফ্লো কন্ট্রোল প্রদান করে এবং আপনাকে কোড এক্সিকিউশন সিকোয়েন্স পরিবর্তন করতে সক্ষম করে। সেমিকোলনও একটি ব্যাশ কন্ট্রোল অপারেটর মনে করা হয়, مثل নিউলাইন ক্যারেক্টার।

&& অপারেটরটি বলতে গেলে, "যদি command1 সফল হয়, তবে command2 রান করো। যদি command1 যেকোনো কারণে ফেইল করে, তবে command2 স্কিপ করো।" সিনট্যাক্সটি দেখতে এরকম:

command1 && command2

এখন, কিছু কমান্ড দেখুন যা একটি নতুন ডিরেক্টরি তৈরি করবে এবং—যদি সফল হয়—এটিকে প্রেজেন্ট ওয়ার্কিং ডিরেক্টরি (PWD) বানাবে। নিশ্চিত করুন আপনার হোম ডিরেক্টরি (~) PWD। প্রথমে /root-এ চেষ্টা করুন, একটি ডিরেক্টরি যেটি আপনার অ্যাক্সেস নেই:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$

এররটি mkdir কমান্ড থেকে এমিট হয়েছে। আপনি ফাইল তৈরি করা যায় না এমন কোনো এরর পেয়েনি কারণ ডিরেক্টরি তৈরিই ফেইল হয়েছে। && কন্ট্রোল অপারেটর নন-জিরো রিটার্ন কোড বুঝতে পারলো, তাই touch কমান্ডটি স্কিপ হয়ে গেলো। && কন্ট্রোল অপারেটর ব্যবহার করলে touch কমান্ডটি রান হয় না কারণ ডিরেক্টরি তৈরি করতে এরর হয়েছিল। এই ধরনের কমান্ড-লাইন প্রোগ্রাম ফ্লো কন্ট্রোল এররগুলো কম্পাউন্ড হয়ে একদম গड़বড় করার ازবাড় রাখতে পারে। কিন্তু একটু বেশি জটিল করার সময়।

|| কন্ট্রোল অপারেটর আপনাকে একটি অন্য প্রোগ্রাম স্টেটমেন্ট যোগ করতে দেয় যা এক্সিকিউট হয় যখন ইনিশিয়াল প্রোগ্রাম স্টেটমেন্ট শূন্য চেয়ে বড় একটি কোড রিটার্ন করে। বেসিক সিনট্যাক্স দেখতে এরকম:

command1 || command2 

এই সিনট্যাক্সটি পড়ে: "যদি command1 ফেইল করে, command2 এক্সিকিউট করো।" এটা ইমপ্লাই করে যে যদি command1 সফল হয়, command2 স্কিপ হয়। একটি নতুন ডিরেক্টরি তৈরি করার চেষ্টা করে এটি ট্রাই করুন:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

এটা ঠিক সেইطور যা আপনি আশা করবেন। যেহেতু নতুন ডিরেক্টরি তৈরি করা সম্ভব হয়নি, প্রথম কমান্ডটি ফেইল করলো, ফলে দ্বিতীয় কমান্ড এক্সিকিউট হয়েছে।

এই দুটি অপারেটর কম্বাইন করলে দুটির সেরা পারফরম্যান্স পাওয়া যায়। && এবং || কন্ট্রোল অপারেটর ব্যবহার করে কিছু ফ্লো কন্ট্রোলসহ কন্ট্রোল অপারেটর সিনট্যাক্স এই সাধারণ ফর্ম নেয়:

preceding commands ; command1 && command2 || command3 ; following commands

এই সিনট্যাক্সটি এভাবে বলা যায়: "যদি command1 রিটার্ন কোড ০ দিয়ে এক্সিট করে, তবে command2 এক্সিকিউট করো, অন্যথায় command3 এক্সিকিউট করো।" চেষ্টা করুন:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

এখন একই কমান্ডটি আবার আপনার হোম ডিরেক্টরি দিয়ে চেষ্টা করুন /root ডিরেক্টরির বদলে। আপনার এই ডিরেক্টরি তৈরির পারমিশন থাকবে:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$

কন্ট্রোল অপারেটর সিনট্যাক্স, যেন command1 && command2, কাজ করে কারণ প্রতিটি কমান্ড একটি রিটার্ন কোড (RC) শেলে পাঠায় যা ইঙ্গিত দেয় সেটি সফলভাবে সম্পন্ন হয়েছে কিনা বা এক্সিকিউশনের সময় কোনো ধরনের ফেইলियर হয়েছে কিনা। কনভেনশন অনুযায়ী, ০ (শূন্য) RC সাফল্য ইঙ্গিত দেয়, এবং যেকোনো পজিটিভ নাম্বার কোনো ধরনের ফেইলियर ইঙ্গিত দেয়। সিস্টেম অ্যাডমিন যেসব টুল ব্যবহার করে সেগুলো কেবল ১ রিটার্ন করে ফেইলার ইঙ্গিত দিতে, কিন্তু অনেক টুল অন্যান্য কোড ব্যবহার করে ফেইলারের টাইপ ইঙ্গিত দিতে।

ব্যাশ শেল ভেরিয়েবল $? লাস্ট কমান্ড থেকে RC ধারণ করে। এই RC কে খুব সহজে একটি স্ক্রিপ্ট, কমান্ডের একটি লিস্টে পরবর্তী কমান্ড, বা এমনকি সরাসরি সিস্টেম অ্যাডমিন চেক করতে পারে। RC সবসময় লাস্ট কমান্ডের হবে যা আপনি চেক করার আগে রান হয়েছিল।

একটি সহজ কমান্ড রান করুন এবং অবিলম্বে RC চেক করুন:

[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x 2 student student 4096 Mar 2 08:21 chapter25
drwxrwxr-x 2 student student 4096 Mar 21 15:27 chapter26
-rwxr-xr-x 1 student student 92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student 4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$

এই কেসে RC শূন্য, অর্থাৎ কমান্ডটি সফলভাবে সম্পন্ন হয়েছে। এখন রুটের হোম ডিরেক্টরিতে একই কমান্ড চেষ্টা করুন, একটি ডিরেক্টরি যেটি আপনার পারমিশন নেই:

[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$

এই কেসে RC দুই, অর্থাৎ নন-রুট ইউজারের জন্য পারমিশন ডেনাইড হয়েছে যেটি সেই ডিরেক্টরিতে অ্যাক্সেস করার অনুমতি নেই। কন্ট্রোল অপারেটরগুলো এই RC গুলো ব্যবহার করে আপনাকে প্রোগ্রাম এক্সিকিউশন সিকোয়েন্স পরিবর্তন করতে সক্ষম করে।

সারসংক্ষেপ

এই আর্টিকেলে প্রোগ্রামিং ভাষা হিসেবে ব্যাশ এবং এর বেসিক সিনট্যাক্স এবং কিছু বেসিক টুল নিয়ে আলোচনা করা হয়েছে। এটা দেখিয়েছে কীভাবে STDOUT-এ ডেটা প্রিন্ট করতে হয় এবং কীভাবে ভেরিয়েবল এবং কন্ট্রোল অপারেটর ব্যবহার করতে হয়। এই সিরিজের পরবর্তী আর্টিকেলে ব্যাশের অনেক লজিক্যাল অপারেটর দেখা হবে যা ইনস্ট্রাকশন এক্সিকিউশনের ফ্লো কন্ট্রোল করে।

  1. rbash: রেস্ট্রিক্টেড Bash শেল মাস্টার করুন – কনসেপ্ট, ব্যবহার, এবং প্র্যাক্টিক্যাল উদাহরণ

  2. jm-shell: বিস্তারিত অ্যাক্টিভিটি লগসহ ফিচার-রিচ, কাস্টমাইজেবল বাশ শেল

  3. Windows সফটওয়্যার ম্যানেজমেন্ট মাস্টার করুন: Scoop দিয়ে অ্যাপ ইনস্টল ও আপডেট করুন

  4. Adobe Reader ও অন্যান্য টুল দিয়ে PDF ফাইল মার্জ করুন দ্রুত