&&
এবং ||
অপারেটরদের হয় না যদি-তারপর-অন্য জন্য ইনলাইন প্রতিস্থাপন সঠিক। যদিও সাবধানে ব্যবহার করা হয়, তারা একই জিনিসটি অনেক কিছু সম্পাদন করতে পারে।
একটি একক পরীক্ষা সোজা এবং দ্ব্যর্থহীন ...
[[ A == A ]] && echo TRUE # TRUE
[[ A == B ]] && echo TRUE #
[[ A == A ]] || echo FALSE #
[[ A == B ]] || echo FALSE # FALSE
তবে একাধিক পরীক্ষা যুক্ত করার চেষ্টা করলে অপ্রত্যাশিত ফলাফল হতে পারে ...
[[ A == A ]] && echo TRUE || echo FALSE # TRUE (as expected)
[[ A == B ]] && echo TRUE || echo FALSE # FALSE (as expected)
[[ A == A ]] || echo FALSE && echo TRUE # TRUE (as expected)
[[ A == B ]] || echo FALSE && echo TRUE # FALSE TRUE (huh?)
মিথ্যা এবং সত্য উভয়ই কেন প্রতিধ্বনিত হয়?
এখানে যা ঘটছে তা হ'ল আমরা বুঝতে পারিনি &&
এবং ||
ওভারলোডেড অপারেটররা শর্তসাপেক্ষ টেস্ট বন্ধনীর ভিতরে আলাদা আলাদাভাবে কাজ করে [[ ]]
যা তারা এখানে এবং ওআর (শর্তসাপেক্ষ কার্যকরকরণ) তালিকার তুলনায় করে।
বাশ ম্যানপেজ থেকে (সম্পাদিত) ...
তালিকাসমূহ
তালিকাটি হ'ল এক বা একাধিক পাইপলাইনগুলির একটি ক্রম যা অপারেটরগুলির মধ্যে একটি দ্বারা পৃথক;, &, &&, বা ││, এবং বিকল্পভাবে; এই তালিকা অপারেটরগুলির মধ্যে, && এবং equal এর পরে সমান প্রাধান্য রয়েছে; এবং & এর সমান নজরে রয়েছে।
এক বা একাধিক নতুন লাইনের একটি ক্রম কমান্ডটি সীমাবদ্ধ করতে সেমিকোলনের পরিবর্তে একটি তালিকায় উপস্থিত হতে পারে।
যদি কমান্ডটি কন্ট্রোল অপারেটর & এর মাধ্যমে সমাপ্ত হয়, তবে শেলটি একটি সাবশেলের পটভূমিতে কমান্ডটি কার্যকর করে। শেলটি কমান্ডটি শেষ হওয়ার জন্য অপেক্ষা করে না, এবং ফেরতের স্থিতি 0 হয় কমান্ড a দ্বারা পৃথক; ধারাবাহিকভাবে মৃত্যুদন্ড কার্যকর করা হয়; শেল প্রতিটি কমান্ডের জন্য ঘুরে দাঁড়ানোর জন্য অপেক্ষা করে। রিটার্নের স্থিতি হ'ল শেষ আদেশের নির্বাহ স্থিতি।
AND এবং OR তালিকাগুলি যথাক্রমে && এবং and কন্ট্রোল অপারেটরগুলি দ্বারা পৃথক করা আরও পাইপলাইনগুলির একটির ক্রম। এবং এবং ওআর তালিকা বাম সাহসিকতার সাথে সম্পাদিত হয়।
একটি এবং তালিকাটির ফর্ম রয়েছে ...
command1 && command2
কমান্ড 2 কার্যকর করা হয় এবং কেবল যদি, কমান্ড 1 শূন্যের প্রস্থান স্থিতি দেয়।
একটি OR তালিকাতে ফর্ম রয়েছে ...
command1 ││ command2
কমান্ড 2 কার্যকর করা হয় এবং কেবলমাত্র যদি কমান্ড 1 একটি শূন্য-বহির্গমন স্থিতি ফিরে আসে।
AND এবং OR তালিকাগুলির রিটার্নের স্থিতি হ'ল তালিকার মধ্যে কার্যকর হওয়া শেষ কমান্ডের প্রস্থান স্থিতি।
আমাদের শেষ উদাহরণে ফিরে ...
[[ A == B ]] || echo FALSE && echo TRUE
[[ A == B ]] is false
|| Does NOT mean OR! It means...
'execute next command if last command return code(rc) was false'
echo FALSE The 'echo' command rc is always true
(i.e. it successfully echoed the word "FALSE")
&& Execute next command if last command rc was true
echo TRUE Since the 'echo FALSE' rc was true, then echo "TRUE"
ঠিক আছে. যদি এটি সঠিক হয়, তবে শেষ উদাহরণের পরবর্তী কেন কিছু কিছু প্রতিধ্বনিত হয়?
[[ A == A ]] || echo FALSE && echo TRUE
[[ A == A ]] is true
|| execute next command if last command rc was false.
echo FALSE Since last rc was true, shouldn't it have stopped before this?
Nope. Instead, it skips the 'echo FALSE', does not even try to
execute it, and continues looking for a `&&` clause.
&& ... which it finds here
echo TRUE ... so, since `[[ A == A ]]` is true, then it echos "TRUE"
একাধিক &&
বা ||
কমান্ড তালিকায় ব্যবহার করার সময় যুক্তি ত্রুটির ঝুঁকি বেশ বেশি।
প্রস্তাবনা
একক &&
বা ||
কমান্ড তালিকার প্রত্যাশার মতো কাজ করে তাই এটি নিরাপদ। যদি এমন পরিস্থিতি হয় যেখানে আপনার আর একটি ধারা প্রয়োজন হয় না, তবে নীচের মতো কিছু অনুসরণ করা আরও পরিষ্কার হতে পারে (কোঁকড়া ধনুর্বন্ধনী শেষ 2 কমান্ডের গোষ্ঠীকরণের জন্য প্রয়োজনীয়) ...
[[ $1 == --help ]] && { echo "$HELP"; exit; }
একাধিক &&
এবং ||
অপারেটর, যেখানে সর্বশেষ ব্যতীত প্রতিটি কমান্ড একটি পরীক্ষা (যেমন বন্ধনীগুলির অভ্যন্তরে [[ ]]
) থাকে, সাধারণত সমস্ত হিসাবে সুরক্ষিত থাকে তবে শেষ অপারেটর প্রত্যাশা অনুযায়ী আচরণ করে। শেষ অপারেটর আরও then
বা একটি else
শৃঙ্খলার মতো কাজ করে ।
&&
এবং||
শেল অপারেটরগুলির যেমনcmd1 && cmd2 || cmd3
পূর্বনীতি রয়েছে, তখন&&
ইন((...))
এবং[[...]]
এর অগ্রাধিকার রয়েছে||
(((a || b && c))
হয়((a || (b && c)))
)। একই-a
/-o
জন্যtest
/[
এবংfind
এবং&
/|
ইন যায়expr
।