ক্লাসিক কৌশল (এস্কেপ মেটাচার্যাক্টস):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
আমি রেফারেন্সগুলি $g
ডাবল উক্তিগুলিতে আবদ্ধ করেছি ; সাধারণভাবে এটি ভাল অনুশীলন। কড়া কথায়, প্রথম বন্ধনীগুলির প্রয়োজন হয় না কারণ এর অগ্রাধিকার রয়েছে -a
এবং -o
এগুলি ছাড়াও এটি সংশোধন করে।
লক্ষ্য করুন -a
এবং -o
অপারেটরদের জন্য POSIX স্পেসিফিকেশন অংশ test
, ওরফে [
, প্রধানত পিছন সামঞ্জস্যের জন্য (যেহেতু তারা একটা অংশ ছিল test
7th সংস্করণ ইউনিক্স মধ্যে, উদাহরণস্বরূপ), কিন্তু তারা স্পষ্টভাবে POSIX দ্বারা 'লুপ্তপ্রায়' হিসেবে চিহ্নিত করা হয়েছে। বাশ ( শর্তসাপেক্ষ এক্সপ্রেশনগুলি দেখুন ) ক্লাসিক এবং POSIX অর্থকে নিজের বিকল্প অপারেটরগুলির পক্ষে -a
এবং -o
যুক্তিগুলি গ্রহণ করে বলে মনে হয় ।
কিছু যত্ন সহ, আপনি আরও আধুনিক [[
অপারেটর ব্যবহার করতে পারেন , তবে সচেতন হন যে বাশ এবং কর্ন শেলের সংস্করণগুলিতে অভিন্ন হওয়ার দরকার নেই ident
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
ম্যাক ওএস এক্সে ব্যাশ ৩.২.৫7 ব্যবহার করে রান উদাহরণ:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
[[
আপনার সাথে ভেরিয়েবলগুলি উদ্ধৃত করার দরকার নেই [
কারণ এটি যেভাবে হয় তেমন পৃথক কমান্ড নয় [
।
এটি কি ক্লাসিক প্রশ্ন নয়?
আমি তাই ভাবতাম। তবে, আরও একটি বিকল্প রয়েছে:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
আসলে, আপনি যদি autoconf
সরঞ্জাম বা সম্পর্কিত প্যাকেজগুলির জন্য 'পোর্টেবল শেল' নির্দেশিকাটি পড়েন তবে এই নোটেশনটি ' ||
' এবং ' &&
' ব্যবহার করে - তারা তাদের পরামর্শ দেয় they আমি মনে করি আপনি এমনকি এতদূর যেতে পারেন:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
ক্রিয়াগুলি যেমন প্রতিধ্বনির মতো তুচ্ছ, সেখানে এটি খারাপ নয়। পুনরাবৃত্তি করার জন্য অ্যাকশন ব্লকটি একাধিক রেখাগুলি হলে পুনরাবৃত্তিটি খুব বেদনাদায়ক এবং পূর্ববর্তী সংস্করণগুলির মধ্যে একটি পছন্দনীয় - অথবা আপনাকে ক্রিয়াকলাপগুলিকে বিভিন্ন ফাংশনে আবদ্ধ করা দরকার যা বিভিন্ন ব্লকটিতে ডাকা then
হয়।
test
([
) দ্বারা মূল্যায়ন করা হয় । শেলটি কেবল প্রস্থান স্থিতির মূল্যায়ন করে[
।