भ्रमित करने का उपयोग && और || ऑपरेटरों


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

यदि बाईं ओर की &&निकास स्थिति शून्य है (यानी सत्य) तो केवल दाईं ओर मूल्यांकन किया जाएगा। ||इसके विपरीत है: यह केवल दाईं ओर का मूल्यांकन करेगा यदि बाईं ओर निकास स्थिति गैर-शून्य (यानी झूठी) है।

आप [ ... ]एक रिटर्न वैल्यू वाला प्रोग्राम मान सकते हैं। यदि अंदर का परीक्षण सत्य का मूल्यांकन करता है, तो यह शून्य पर लौटता है; यह अन्यथा नॉनवेज लौटता है।

उदाहरण:

$ false && echo howdy!

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

$ false || echo howdy!
howdy!

अतिरिक्त नोट:

यदि आप करते हैं which [, तो आप देख सकते हैं कि [वास्तव में एक कार्यक्रम को इंगित करता है! यह आमतौर पर लिपियों में चलने वाला वास्तव में नहीं है, हालांकि; चलाने type [को देखने के लिए क्या वास्तव में चलाने के हो जाता है। यदि आप प्रोग्राम का उपयोग करने की कोशिश करना चाहते हैं, तो बस पूरा रास्ता दें जैसे /bin/[ 1 = 1:।


6
जब आप "X या Y" देखते हैं, तो आप X का परीक्षण करते हैं। यदि यह सत्य है, तो आप पहले से ही "X या Y" (यह सच है) का उत्तर जानते हैं, इसलिए Y का परीक्षण करने की कोई आवश्यकता नहीं है। यदि यह सत्य है, तो आप नहीं जानते। "X या Y" का उत्तर, इसलिए आपको Y का परीक्षण करने की आवश्यकता है। जब आप "X और Y" देखते हैं, तो आप X का परीक्षण करते हैं। यदि यह गलत है, तो आप पहले से ही "X और Y" का उत्तर जानते हैं (यह गलत है), इसलिए Y का परीक्षण करने की कोई आवश्यकता नहीं है। यदि X सत्य है, तो आपको यह देखने के लिए Y का परीक्षण करने की आवश्यकता है कि क्या "X और Y" सत्य है।
डेविड श्वार्ट्ज

2
"यदि बाईं ओर शून्य लौटता है" के बजाय, मैं लिखूंगा "यदि बाईं ओर कमांड की निकास स्थिति शून्य है"। मुझे "वापसी" आउटपुट के रूप में थोड़ा अस्पष्ट लगता है और बाहर निकलने की स्थिति दोनों को "वापसी मूल्यों" के रूप में माना जा सकता है
ग्लेन जैकमैन

न केवल आप " एक कार्यक्रम पर विचार कर सकते हैं" [ ... ], कई मामलों में यह है । यह आमतौर पर फ़ाइल में /bin/[या है /usr/bin/[
एलएस

5
सी प्रोग्रामर इस सुपर भ्रामक मिल जाएगा। 0 का अर्थ है असत्य ... जबकि शेल्स्क्रिप्टिंग में 0 का अर्थ है सत्य ... माइंड ब्लो।
कैलमेरियस

एक और जिसे आप उल्लेख कर सकते testहैं ifया इसके बजाय है [। और if [और if testसाथ बीच-बीच में हो रहे हैं [और testकोई स्पष्ट कविता या कारण के साथ। testइस अवसर पर दिखाता है, जैसे Fedora x86_64 पर वेंडर लिबास के लिए config.site पर

58

यहाँ मेरा धोखा पत्र है:

  • "ए; बी" ए की सफलता की परवाह किए बिना, ए और फिर बी चलाएं
  • "A && B" रन B यदि A सफल हुआ
  • "ए" बी "रन बी अगर ए विफल रहा
  • पृष्ठभूमि में "ए एंड" रन ए।

यहाँ कुछ दिलचस्प लैंबडा कैलकुलस समानताएं काम कर रही हैं, जो जावास्क्रिप्ट में काम करती हैं (क्रम में चर को परिभाषित करती हैं); "बाएं (उर्फ सच)" (a => b => a):। "सही (उर्फ झूठे)" (a => b => b):। "ए; बी" "फिर" (a => b => (() => b())(a()))। "A && B" "यदि और के बिना (जब)" (a => b => a()(() => right)(b))। "ए" बी "" बिना (अगर) के बिना " (a => b => a()(b)(() => right))। "एक && ख || ग" "ifThenElse" (a => b => c => (unless(when(a)(b))(c))())
दिमित्री

1
ध्यान दें कि बाश में, बाएं अनुरूप 0 / खाली स्ट्रिंग है, सही अनुरूप सब कुछ है।
दिमित्री

27

ऊपर से @ शॉन-जे-गोफ के उत्तर पर विस्तार करने के लिए, &&एक तार्किक AND है, और ||एक तार्किक OR है।

उन्नत बैश स्क्रिप्टिंग गाइड के इस भाग को देखें । नीचे दिए गए उपयोगकर्ता संदर्भ के लिए लिंक से कुछ सामग्री।

&& तथा

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 है तो पारंपरिक पुनरावृति शेल में निम्नानुसार होगी:

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"

चरों को सेट करने के लिए या फ़ाइलों आदि को बनाने के लिए कुछ पुनरावृत्तियों को चलाते समय, जीवन आसान होता है और स्क्रिप्ट सिंगल लाइन का उपयोग करते हुए यदि कार्य करता है, तो स्लीक दिखता है, केवल दोष यह है कि एक एकल पुनरावृत्ति से कई कमांडों को लागू करना थोड़ा मुश्किल हो जाता है आप कार्यों का उपयोग कर सकते हैं।


यह अच्छा है। मुझे objc कोड की याद दिलाता है (a = b); val = 1: val = 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
लॉजिक को आमतौर पर "शॉर्ट सर्क्युटिंग" के रूप में जाना जाता है। मैंने कभी भी "शॉर्ट कटिंग" वाक्यांश का उपयोग नहीं किया है। मैं संदर्भ खोजने में मदद करने के लिए इसका उल्लेख करता हूं।
एलएस

-1

शॉन जे। गोफ द्वारा उत्तर में दिए गए उदाहरण सही हैं, लेकिन स्पष्टीकरण अन्य तरीके से है। कृपया जांचें:

&& के दाईं ओर का मूल्यांकन केवल तभी किया जाएगा जब बाईं ओर का निकास स्थिति NONZERO हो। || इसके विपरीत है: यह दाईं ओर का मूल्यांकन केवल तभी होगा जब बाईं ओर निकास स्थिति शून्य है।


3
आप जानते हैं कि गोले के लिए शून्य निकास कोड सही का मूल्यांकन करता है और इस तरह से झूठी अभिव्यक्ति वापस करने के लिए पूरी अभिव्यक्ति में परिणामों के बाईं ओर गैर-एक्सो कोड होता है ? &&
काउंटर

1
किसी ने आपके संपादन को मंजूरी नहीं दी क्योंकि यह आपका उत्तर नहीं था। यदि आपको लगता है कि कुछ उत्तर गलत है, तो आपको इसे रद्द कर देना चाहिए और संभवतः एक टिप्पणी छोड़नी चाहिए; अगर आपको लगता है कि इसमें बदलाव की आवश्यकता है, तो आपको एक टिप्पणी छोड़नी चाहिए। संपादन व्याकरण, स्वरूपण और वर्तनी की गलतियों को सुधारने के लिए है जो उत्तर के अर्थ को नहीं बदलते हैं।
टेक्रफ सिप

1
@countermode मुझे क्षमा करें, आप सही हैं, मैंने लिनक्स में शून्य = गलत और नॉनजरो = सच (सी और कई अन्य भाषाओं / वातावरण / प्लेटफार्मों की तरह) सोचा। मैं गलतफहमी के लिए माफी मांगता हूं।
Try2Help
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.