টার্নারি অপারেটর, ((test)) && cmd1 || cmd2
বা [ test ] && cmd1 || cmd2
যতটা সম্ভব অপব্যবহার করুন ।
উদাহরণ (দৈর্ঘ্যের গণনা সর্বদা শীর্ষ রেখা বাদ দেয়):
t="$something"
if [ $t == "hi" ];then
cmd1
cmd2
elif [ $t == "bye" ];then
cmd3
cmd4
else
cmd5
if [ $t == "sup" ];then
cmd6
fi
fi
কেবলমাত্র টের্নারি অপারেটরগুলি ব্যবহার করে, এটি সহজেই সংক্ষিপ্ত করা যেতে পারে:
t="$something"
[ $t == "hi" ]&&{
cmd1;cmd2
}||[ $t == "bye" ]&&{
cmd3;cmd4
}||{
cmd5
[ $t == "sup" ]&&cmd6
}
যেমন হিসাবে nyuszika7h মন্তব্যগুলিতে উল্লেখ করেছেন, এই নির্দিষ্ট উদাহরণটি আরও ব্যবহার করে আরও ছোট করা যেতে পারে case
:
t="$something"
case $t in "hi")cmd1;cmd2;;"bye")cmd3;cmd4;;*)cmd5;[ $t == "sup" ]&&cmd6;esac
এছাড়াও, যতটা সম্ভব বন্ধনীগুলির জন্য বন্ধনী পছন্দ করুন। যেহেতু প্রথম বন্ধনীগুলি একটি মেটাচার্যাক্টর, এবং একটি শব্দ নয়, তাদের কোনও প্রসঙ্গে স্থানের প্রয়োজন হয় না। এর অর্থ হ'ল সম্ভব সাবস্কেলে যতগুলি কমান্ড চালানো সম্ভব, কারণ কোঁকড়ানো ধনুর্বন্ধনী (যেমন {
এবং }
) সংরক্ষিত শব্দ, মেটা-অক্ষর নয়, এবং সঠিকভাবে পার্স করার জন্য উভয় পক্ষের সাদা অংশ থাকতে হবে, তবে মেটা-অক্ষরগুলি নেই। আমি ধরে নিলাম যে আপনি এখনই জানেন যে সাবশেলগুলি পিতামন্ত্রের পরিবেশকে প্রভাবিত করে না, তাই ধরে নিই যে সমস্ত উদাহরণ কমান্ডগুলি নিরাপদে একটি সাবশেলে চালানো যেতে পারে (যা কোনও ক্ষেত্রেই সাধারণ নয়), আপনি উপরের কোডটি সংক্ষিপ্ত করতে পারবেন :
t=$something
[ $t == "hi" ]&&(cmd1;cmd2)||[ $t == "bye" ]&&(cmd3;cmd4)||(cmd5;[ $t == "sup" ]&&cmd6)
এছাড়াও, যদি আপনি না পারেন তবে প্যারেন্থিস ব্যবহার করে কিছুটা এটিকে ছোট করে দিতে পারে। একটি জিনিস মনে রাখবেন তা হ'ল এটি কেবল পূর্ণসংখ্যার জন্য কাজ করে, যা এ উদাহরণের উদ্দেশ্যে এটি অকেজো করে তোলে (তবে এটি -eq
পূর্ণসংখ্যার জন্য ব্যবহার করার চেয়ে অনেক ভাল )।
আরও একটি বিষয়, যেখানে সম্ভব উদ্ধৃতিগুলি এড়িয়ে চলুন। উপরের পরামর্শটি ব্যবহার করে, আপনি আরও এটিকে ছোট করতে পারেন। উদাহরণ:
t=$something
[ $t == hi ]&&(cmd1;cmd2)||[ $t == bye ]&&(cmd3;cmd4)||(cmd5;[ $t == sup ]&&cmd6)
পরীক্ষার শর্তে, কয়েকটি ব্যাতিক্রম দিয়ে যতটা সম্ভব ডাবল বন্ধনীগুলিতে একক বন্ধনী পছন্দ করুন। এটি নিখরচায় দুটি চরিত্র হ্রাস করে তবে কিছু ক্ষেত্রে এটি এতটা দৃust় নয় (এটি একটি বাশ এক্সটেনশান - উদাহরণের জন্য নীচে দেখুন)। এছাড়াও, দ্বিগুণের পরিবর্তে একক সমতুল্য যুক্তি ব্যবহার করুন। এটি বাদ দেওয়ার জন্য একটি মুক্ত চরিত্র।
[[ $f == b ]]&&: # ... <-- Bad
[ $f == b ]&&: # ... <-- Better
[ $f = b ]&&: # ... <-- Best. word splits and pathname-expands the contents of $f. Esp. bad if it starts with -
এই সতর্কতা নোট করুন, বিশেষত নাল আউটপুট বা একটি অপরিজ্ঞাত ভেরিয়েবল পরীক্ষা করার জন্য:
[[ $f ]]&&: # double quotes aren't needed inside [[, which can save chars
[ "$f" = '' ]&&: <-- This is significantly longer
[ -n "$f" ]&&:
সমস্ত প্রযুক্তিগত ক্ষেত্রে, এই নির্দিষ্ট উদাহরণটি দিয়ে সর্বোত্তম হবে case
... in
:
t=$something
case $t in hi)cmd1;cmd2;;bye)cmd3;cmd4;;*)cmd5;[ $t == sup ]&&cmd6;esac
পিএস: এখানে প্রসঙ্গ নির্বিশেষে বাশে স্বীকৃত মেটা-অক্ষরের একটি তালিকা রয়েছে (এবং শব্দ পৃথক করতে পারে):
সম্পাদনা: ম্যানটওয়ার্ক যেমন উল্লেখ করেছে, ডাবল প্রথম বন্ধনী পরীক্ষা কেবল পূর্ণসংখ্যার জন্য কাজ করে। এছাড়াও, অপ্রত্যক্ষভাবে, আমি দেখতে পেলাম যে ==
অপারেটরের চারপাশে আপনার সাদা স্থান থাকতে হবে । উপরে আমার পোস্ট সংশোধন করেছেন।
আমিও প্রতিটি বিভাগের দৈর্ঘ্য গণনা করতে খুব অলস ছিলাম, তাই আমি কেবল সেগুলি সরিয়েছি। প্রয়োজনে অনলাইনে স্ট্রিং দৈর্ঘ্যের ক্যালকুলেটরটি খুঁজে পাওয়া যথেষ্ট সহজ হওয়া উচিত।
sh
এবং শেলটি এইfor
সিনট্যাক্সটিকে কী অনুমতি দেয় ? এটি স্পষ্টভাবে অনুমতি দেওয়া হয়zsh
।