&& এবং এর বিভ্রান্তিমূলক ব্যবহার || অপারেটার


92

আমি একটি /etc/rc.d/init.d/sendmailফাইলে স্কিমিং করছিলাম (আমি জানি এটি খুব কমই ব্যবহৃত হয় তবে আমি পরীক্ষার জন্য পড়াশোনা করি), এবং আমি &&এবং ||অপারেটরদের সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি । আমি পড়েছি যেখানে এগুলি বিবৃতিতে ব্যবহার করা যেতে পারে যেমন:

if [ test1 ] && [ test2 ]; then
     echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
     echo "one test is true"
fi

তবে এই স্ক্রিপ্টটি একক লাইনের স্টেটমেন্টগুলি দেখায় যেমন:

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0

এটি টেস্টের উপর ভিত্তি করে প্রতিক্রিয়াগুলি প্রকাশ করতে অপারেটরগুলি &&এবং ||অপারেটরগুলি ব্যবহার করছে বলে মনে হচ্ছে , তবে আমি এই অপারেটরগুলির এই বিশেষ ব্যবহার সম্পর্কে ডকুমেন্টেশন খাঁজতে সক্ষম হইনি। এই নির্দিষ্ট প্রসঙ্গে এগুলি কী কী কেউ ব্যাখ্যা করতে পারে?

উত্তর:


140

&&বাম পাশের প্রস্থান স্থিতি শূন্য হলে (যেমন সত্য) কেবল তখনই ডান দিকের মূল্যায়ন করা হবে। ||বিপরীত: এটি যদি বাম দিকের প্রস্থান স্থিতি শূন্য (অর্থাৎ মিথ্যা) হয় তবে ডান দিকটি মূল্যায়ন করবে।

আপনি [ ... ]রিটার্ন মান সহ একটি প্রোগ্রাম হিসাবে বিবেচনা করতে পারেন। যদি অভ্যন্তরীণ পরীক্ষাটি সত্যকে মূল্যায়ন করে তবে এটি শূন্য ফিরে আসে; এটি অন্যথায় nonzero ফেরত।

উদাহরণ:

$ false && echo howdy!

$ true && echo howdy!
howdy!
$ true || echo howdy!

$ false || echo howdy!
howdy!

অতিরিক্ত নোট:

যদি আপনি এটি করেন তবে আপনি which [দেখতে পাবেন যে এটি [আসলে কোনও প্রোগ্রামকে নির্দেশ করে! যদিও এটি সাধারণত স্ক্রিপ্টগুলিতে চালিত হয় না; চালানোর type [দেখতে আসলে চালানো হয়। আপনি প্রোগ্রাম ব্যবহার করার চেষ্টা করুন থেকে wan পারেন, ঠিক তাই মত সম্পূর্ণ পাথ দিতে: /bin/[ 1 = 1


6
আপনি যখন "এক্স বা ওয়াই" দেখেন, আপনি এক্স পরীক্ষা করেন it's যদি এটি সত্য হয় তবে আপনি ইতিমধ্যে "এক্স বা ওয়াই" (এটি সত্য) এর উত্তরটি জানেন, তাই ওয়াইয়ের পরীক্ষা করার প্রয়োজন নেই If যদি এটি সত্য হয় তবে আপনি এটি জানেন না "এক্স বা ওয়াই" এর উত্তর, সুতরাং আপনার ওয়াই পরীক্ষা করা দরকার you আপনি যখন "এক্স এবং ওয়াই" দেখেন, আপনি এক্স পরীক্ষা করেন it's যদি এটি মিথ্যা হয়, আপনি ইতিমধ্যে "এক্স এবং ওয়াই" এর উত্তর জানেন (এটি মিথ্যা), সুতরাং ওয়াই পরীক্ষা করার দরকার নেই। এক্স যদি সত্য হয়, তবে আপনার "এক্স এবং ওয়াই" সত্য কিনা তা পরীক্ষা করার জন্য আপনার ওয়াই পরীক্ষা করতে হবে।
ডেভিড শোয়ার্টজ

2
"যদি বাম দিকটি শূন্য প্রত্যাবর্তন করে" এর পরিবর্তে, আমি "বাম দিকের কমান্ডের প্রস্থান স্থিতি শূন্য হলে" লিখব। আউটপুট হিসাবে আমি "রিটার্ন "টিকে কিছুটা অস্পষ্ট দেখতে পেয়েছি এবং প্রস্থান স্থিতি উভয়কেই" রিটার্ন মান "হিসাবে বিবেচনা করা যেতে পারে
glenn jackman

আপনি কেবল " প্রোগ্রাম হিসাবে বিবেচনা " করতে পারবেন না [ ... ], অনেক ক্ষেত্রেই এটি হয় । এটি সাধারণত ফাইলটিতে /bin/[বা /usr/bin/[
LS

5
সি প্রোগ্রামাররা এই সুপার বিভ্রান্তি খুঁজে পাবেন। 0 টির অর্থ মিথ্যা ... শেলসক্রিপ্ট করার সময় 0 এর অর্থ সত্য ... মন বদ্ধ হয়।
কলমারিয়াস

আপনি উল্লেখ করতে পারেন যে অন্য একটি এর testপরিবর্তে ifবা [। আর if [if testসঙ্গে interspersed হবে বলে মনে হচ্ছে [এবং testকোন আপাত অর্থহীনভাবে সঙ্গে। ফেডোরা x86_64-তে বিক্রেতার libs জন্য config.sitetest এ মত উপলক্ষে প্রদর্শিত হবে ।

58

এখানে আমার ঠকানো শীট:

  • "এ; বি" রান এ এবং তারপরে খ, এ এর ​​সাফল্য নির্বিশেষে
  • "এন্ড অ্যান্ড বি" রান বি যদি সফল হয়
  • "এ || বি" রান বি যদি ব্যর্থ হয়
  • পটভূমিতে "এ &" রান এ।

জাভা স্ক্রিপ্টে (ক্রমগুলি ভেরিয়েবলগুলি সংজ্ঞায়িত করে) প্রদর্শিত এখানে কিছু আকর্ষণীয় ল্যাম্বদা ক্যালকুলাস সমান্তরাল চলছে; "left (ওরফে সত্য)": (a => b => a)। "সঠিক (ওরফে মিথ্যা)": (a => b => b)। "এ; বি" "তখন" (a => b => (() => b())(a()))। "এ & অ্যান্ড বি" "অন্যটি ছাড়া (কখন)" (a => b => a()(() => right)(b))। "এ || বি" "অন্যথায় যদি না থাকে (তবে)" (a => b => a()(b)(() => right))। "a&& b || c" "ifThenElse" (a => b => c => (unless(when(a)(b))(c))())
দিমিত্রি

1
নোট করুন যে ব্যাশে, বামটি সাদৃশ্যযুক্ত 0 / খালি স্ট্রিং, ডান অ্যানালগাস হ'ল সবকিছু।
দিমিত্রি

27

উপর থেকে @ শন-জে-গফের উত্তরটি প্রসারিত করা &&লজিক্যাল অ্যান্ড এবং ||লজিকাল ওআর।

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

&& এবং

if [ $condition1 ] && [ $condition2 ]
#  Same as:  if [ $condition1 -a $condition2 ]
#  Returns true if both condition1 and condition2 hold true...

if [[ $condition1 && $condition2 ]]    # Also works.
#  Note that && operator not permitted inside brackets
#+ of [ ... ] construct.

|| অথবা

if [ $condition1 ] || [ $condition2 ]
# Same as:  if [ $condition1 -o $condition2 ]
# Returns true if either condition1 or condition2 holds true...

if [[ $condition1 || $condition2 ]]    # Also works.
#  Note that || operator not permitted inside brackets
#+ of a [ ... ] construct.

10

আমার অভিজ্ঞতা থেকে আমি && এবং ব্যবহার করি || একটি এক লাইনে যদি বিবৃতি হ্রাস করতে।

বলুন আমরা /root/Sample.txt নামক একটি ফাইল খুঁজছি তারপর শৈলীতে traditionalতিহ্যবাহী পুনরাবৃত্তিটি নিম্নলিখিত হিসাবে থাকবে:

if [ -f /root/Sample.txt ]
then
    echo "file found"
else
    echo "file not found"
fi

এই 6 টি লাইন একক লাইনে হ্রাস করা যেতে পারে:

[[ -f /root/Sample.txt ]] && echo "file found" || echo "file not found"

ভেরিয়েবল সেট করার জন্য বা ফাইলগুলি তৈরি করার জন্য কয়েকটি পুনরাবৃত্তি চালানোর সময়, জীবন সহজ হয় এবং যদি ফাংশনটি হয় তবে স্ক্রিপ্টটি একক লাইন ব্যবহার করে আরও স্মার্ট দেখায়, তবে এটিই হ'ল একক পুনরাবৃত্তি থেকে একাধিক কমান্ড প্রয়োগ করা কিছুটা কঠিন হয়ে যায় যদিও আপনি ফাংশন ব্যবহার করতে পারেন।


এটি দুর্দান্ত। আমাকে অবজেক্ট কোডের স্মরণ করিয়ে দেয় (a == খ)? ভাল = 1: ভাল = 2;
জেনকোড

আমি যখন "ও" দিয়ে পটভূমিতে কোনও প্রক্রিয়া চালাতে চাই তখন আমি এই আদেশটি কীভাবে ব্যবহার করতে পারি? আমি এর জন্য একটি সিনট্যাক্স ত্রুটি পেয়েছি./someScript.sh & && echo 'ok' || echo 'ko'
কেটি

3

"শর্ট কাটিং" এর ধারণা রয়েছে।

কখন (expr1 && expr2)মূল্যায়ন করা হয় - expr2যদি exp1"সত্য" এর মূল্যায়ন হয় তবেই মূল্যায়ন করা হয়। এটি হ'ল expr1এবং expr2সত্য উভয়ের জন্য সত্য (expr1 && expr2)হতে হবে। যদি expr1"মিথ্যা" -এর মূল্যায়ন করা হয় তবে expr2এটি শোধিত হয় না (শর্ট কাট) কারণ (expr1 && expr2)ইতিমধ্যে "ফ্লাস"।

নিম্নলিখিতটি চেষ্টা করুন - ধরে নিন ফাইলটি F1বিদ্যমান এবং ফাইলটি বিদ্যমান F2নেই:

( [ -s F1 ] && echo "File Exists" )  # will print "File Exists" - no short cut
( [ -s F2 ] && echo "File Exists" )  # will NOT print "File Exists" - short cut

একইভাবে ||(বা) - তবে সংক্ষিপ্ত কাটিয়া বিপরীত।


4
যুক্তিটিকে সাধারণত "শর্ট সার্কিট" বলা হয়। "শর্ট কাটিং" শব্দটি আমি কখনও দেখিনি। উল্লেখগুলি খুঁজে পেতে সহায়তা করার জন্য আমি এটি উল্লেখ করছি।
LS

-1

শন জে গফের উত্তরের উদাহরণগুলি সঠিক, তবে ব্যাখ্যাটি অন্যভাবে। দয়া করে পরীক্ষা করুন:

বাম পাশের প্রস্থান স্থিতি ননজারো হলেই && এর ডান দিকটি মূল্যায়ন করা হবে। || বিপরীত: এটি বাম দিকের প্রস্থান স্থিতি শূন্য হলেই ডান দিকটি মূল্যায়ন করবে।


3
আপনি সচেতন যে শেলগুলির জন্য শূন্যের প্রস্থান কোডটি সত্যের সাথে মূল্যায়ন করে এবং এইভাবে ফলাফলের বাম দিকে নানজারো প্রস্থান কোডটি &&পুরো অভিব্যক্তিতে মিথ্যা ফেরত দেয় ?
কাউন্টারমোড

1
কেউ আপনার সম্পাদনাগুলি অনুমোদন করেনি কারণ এটি আপনার উত্তর নয়। যদি আপনি মনে করেন যে কিছু উত্তর ভুল আছে তবে আপনার এটি ডাউনটি করা উচিত এবং সম্ভবত কোনও মন্তব্য করা উচিত; যদি আপনি মনে করেন যে এটির কোনও পরিবর্তন দরকার, আপনার একটি মন্তব্য করা উচিত। সম্পাদনা হ'ল ব্যাকরণ সংশোধন, বিন্যাস এবং বানান ভুল যা উত্তরের অর্থ পরিবর্তন করে না।
টেক্রাফ

1
@ কাউন্টারমোড আমি দুঃখিত, আপনি ঠিক বলেছেন, আমি লিনাক্স শূন্য = মিথ্যা এবং ননজারো = সত্যে (সি এবং অন্যান্য অনেক ভাষা / পরিবেশ / প্ল্যাটফর্মের মতো) ভেবেছিলাম। আমি ভুল বোঝার জন্য ক্ষমা চাই।
চেষ্টা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.