ট্র্যাক
/
Bash
Bash
/
সিলেবাস
/
কন্ডিশনাল
কন

কন্ডিশনাল মধ্যে Bash

{one: "১টি অনুশীলনী", other: "%{count}টি অনুশীলনী"}

কন্ডিশনাল সম্পর্কে

Bash-এ ট্রুথিনেস

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

এক্সিট স্টেটাস

কমান্ড শেষ হলে একটি এক্সিট স্টেটাস তৈরি করে। একটি এক্সিট স্টেটাস হলো 0 থেকে 255-এর মধ্যে থাকা একটি ইন্টিজার (0 আর 255 দুটোই ধরা হয়)। Bash শূন্য এক্সিট স্টেটাসকে সফলতা হিসেবে ধরে। অন্য যেকোনো এক্সিট স্টেটাস ব্যর্থতা বোঝায়।

এটা সব কমান্ডের ক্ষেত্রেই প্রযোজ্য, যার মধ্যে Bash-এর বিল্ট-ইন কমান্ড, কিওয়ার্ড আর ফাংশনও আছে।

"if" কমান্ড

if কমান্ডের মূল সিনট্যাক্স হলো

if CONDITIONAL_COMMANDS; then TRUE_COMMANDS; else FALSE_COMMANDS; fi

এটা if দিয়ে শুরু হয়; কন্ডিশন কমান্ডগুলোকে then দিয়ে "সফলতা"-র কমান্ডগুলো থেকে আলাদা করা হয়; আর এটা fi দিয়ে শেষ হয়। else ক্লজটি ঐচ্ছিক।

CONDITIONAL_COMMANDS হতে পারে একটি একক কমান্ড, আবার হতে পারে কমান্ডের একটি তালিকা।

CONDITIONAL_COMMANDS রান করা হয়, আর

  • এক্সিট স্টেটাস শূন্য হলে (সফলতা), TRUE_COMMANDS রান করা হয়।
  • এক্সিট স্টেটাস অশূন্য হলে (ব্যর্থতা), FALSE_COMMANDS রান করা হয়, যদি সেগুলো থাকে।

elif দিয়ে একটার পর একটা শাখা দেওয়া যায়

if CONDITIONAL_COMMANDS
then TRUE_COMMANDS
elif CONDITIONAL_COMMANDS_2
then TRUE_COMMANDS_2
# more elif branches ...
else FALSE_COMMANDS
fi

then, elif, else আর fi শব্দগুলোর আগে একটা সেমিকোলন বা নতুন লাইন থাকতে হবে।

জোর দিয়ে বলি: কন্ডিশনাল কমান্ডগুলোর এক্সিট স্টেটাসই প্রবাহ নিয়ন্ত্রণ করে। উদাহরণ হিসেবে, মিল পেলে grep 0 রিটার্ন করে, আর মিল না পেলে 1। -q অপশনটি আউটপুট চেপে দেয়, শুধু এক্সিট স্টেটাস তৈরি করে।

if grep -q "my pattern" my_file; then echo "the pattern is found in the file"; fi

"[" আর "test" কমান্ড

CONDITIONAL_COMMANDS ঘিরে কোনো বিশেষ সিনট্যাক্স নেই। আপনি হয়তো এমন if স্টেটমেন্ট দেখে অভ্যস্ত, যেগুলো দেখতে এমন:

if [ "$password" = "secure" ]; then
    echo "Welcome!"
fi

[ কোনো বিশেষ সিনট্যাক্স নয়। এটা একটা কমান্ড, যা কন্ডিশনাল এক্সপ্রেশন মূল্যায়ন করে এবং সফলতা/ব্যর্থতার স্টেটাস নিয়ে শেষ হয়। সব কমান্ডের মতোই, এটার আর এর আর্গুমেন্টগুলোর মাঝে হোয়াইটস্পেস আবশ্যক।

[ আসলে test কমান্ডেরই সমার্থক। দুটো হুবহু একই, শুধু পার্থক্য হলো [-এর শেষ আর্গুমেন্ট অবশ্যই ] হতে হবে।

কন্ডিশনাল এক্সপ্রেশন

[ আর ]-এর ভেতরে আপনি একটি কন্ডিশনাল এক্সপ্রেশন লেখেন। কিছু সাধারণ কন্ডিশনাল এক্সপ্রেশন হলো:

[ -f "$filename" ]             # file operations
[ "$string1" = "$string2" ]    # string comparisons
[ "$num1" -eq "$num2" ]        # arithmetic comparisons

আরও অনেক অপারেশন আছে; সেগুলো ম্যানুয়ালের Bash Conditional Expressions অংশে তালিকাভুক্ত করা আছে।

Note

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

এটা বলা জরুরি, কারণ আপনি কতগুলো আর্গুমেন্ট দিচ্ছেন তার ওপর নির্ভর করে কন্ডিশনাল এক্সপ্রেশন ভিন্নভাবে মূল্যায়িত হয়:

  • 0 আর্গুমেন্ট: এক্সিট স্টেটাস অশূন্য (ব্যর্থতা)
  • 1 আর্গুমেন্ট: আর্গুমেন্ট খালি না থাকলে এক্সিট স্টেটাস শূন্য (সফলতা), খালি থাকলে অশূন্য।
  • 2 আর্গুমেন্ট: প্রথম আর্গুমেন্টটি একটা ইউনারি অপারেটর হতে হবে (যেমন [ -z "$name" ]), অথবা একটা ! (1-আর্গুমেন্ট টেস্টের স্টেটাস উল্টে দেয়)
  • আর আরও অনেক।

কোট করতে ভুলে গেলে আপনি অপ্রত্যাশিত ফল পেতে পারেন:

str=""

# this prints "empty"
if [ -n "$str" ]; then echo "not empty"; else echo "empty"; fi

# leaving the variable unquoted results in incorrect "not empty" output
if [ -n $str ]; then echo "not empty"; else echo "empty"; fi

"[[" কিওয়ার্ড

[[...]] কন্ডিশনাল কনস্ট্রাক্ট কোনো কমান্ড নয়, এটা একটা কিওয়ার্ড। এর মানে হলো, এটাকে অন্য যেকোনো কমান্ডের মতোই হ্যান্ডেল করা হলেও, এর পার্সিং নিয়ম আলাদা। [[-এর বিশেষত্ব হলো, এর ভেতরে এক্সপ্যান্ড হওয়া ভ্যারিয়েবলগুলো ওয়ার্ড স্প্লিটিং বা ফাইলনেম এক্সপ্যানশনের অধীন নয়। মানে এই কমান্ড কোট না করেও আপনার প্রত্যাশামতো কাজ করে।

if [[ -n $str ]]; then echo "not empty"; else echo "empty"; fi

test আর [ যে সব কন্ডিশনাল এক্সপ্রেশন সামলাতে পারে, [[ তার সবগুলোই সাপোর্ট করে। এর বাইরে, [[ দেয়

  • =~ রেগুলার-এক্সপ্রেশন ম্যাচিং অপারেটর,
  • == আর != গ্লব-প্যাটার্ন ম্যাচিং অপারেটর হিসেবে,
  • && আর || লজিক্যাল অপারেটর হিসেবে (পার্সিংয়ের বিশেষ নিয়ম),
  • < আর > "বেয়ার" স্ট্রিং তুলনা অপারেটর হিসেবে (পার্সিংয়ের বিশেষ নিয়ম: এগুলো রিডাইরেকশন সিম্বল, তাই [-এ এগুলো এস্কেপ করতে হয়)।

সাধারণভাবে মনে করা হয়, এই বিশেষ সুবিধাগুলো এতটা উপকার দেয় যে [[-ই শুধু ব্যবহার করা উচিত। (যেমন, Google Shell Style Guide।)

"case" কমান্ড

case আরেকটা কন্ট্রোল ফ্লো কমান্ড। এটা অন্য ভাষার "switch" স্টেটমেন্টের মতো।

case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

প্রতিটি PATTERN-এর সাথে WORD মেলানো হয়। কোনোটা মিললে, COMMANDS রান করা হয়।

read -p "Guess the secret word: " word
case "$word" in
    secret) echo "Yes, you guessed it!" ;;
    ??????) echo "That's the right number of letters." ;;
    s*)     echo "You guessed the first letter." ;;
    *)      echo "Not even close! Try again." ;;
esac

প্রতিটি COMMANDS ক্লজ দুইটা সেমিকোলন দিয়ে শেষ হতে হবে, ;;।

Note
  1. এমন বিকল্পও আছে, যেগুলো ফল-থ্রু কমান্ড এক্সিকিউশন আর প্যাটার্ন ম্যাচিং চালিয়ে যাওয়ার সুবিধা দেয়। বিস্তারিত জানতে ম্যানুয়াল দেখুন।
  2. মনে করুন, প্যাটার্ন নিয়ে আমরা কোটিং কনসেপ্টের ফাইলনেম এক্সপ্যানশন অংশে কথা বলেছিলাম।
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে