2013-02-12 35 views
8

मैं बैशके साथ गूंज || और &&

echo this || echo that && echo other 

पर निम्न आदेश की कोशिश की यह आउटपुट

this 
other 

मुझे लगता है कि समझ में din't देता है!

मेरे सूखी रन इस तरह से चला जाता है:

  1. echo this || echo that && echo other तात्पर्य true || true && true
  2. के बाद से, &&|| से more precedence है, दूसरी अभिव्यक्ति पहले
  3. का मूल्यांकन करता है के बाद से, both are true, || मूल्यांकन किया जाता है जो भी देता है सच।
  4. इसलिए, मैं इस नतीजे होने का उत्पादन:

कि

अन्य

इस

एक जावा पृष्ठभूमि जहां &&|| की तुलना में अधिक पूर्वता है से होने के नाते, मैं इसे बाश से जोड़ने में सक्षम नहीं हूं।

कोई भी इनपुट बहुत उपयोगी होगा!

+0

बाएं से दाएं सहयोगी –

उत्तर

12

आदेश

एक सूची के man bash

3.2.3 सूचियाँ से एक या अधिक पाइपलाइनों ऑपरेटरों में से एक के द्वारा अलग का क्रम है ';', '&', '& &' , या '||', और वैकल्पिक रूप से ';', '&', या एक नई पंक्ति से समाप्त हो गया है।

इन सूची ऑपरेटरों की

, '& &' और '||' है बराबर पूर्वता के बाद ',' और '&' है, जो बराबर पूर्वता है।

तो, अपने उदाहरण

echo this || echo that && echo other 

तरह

(this || that) && other 
2
man bash से

:

इन सूची ऑपरेटरों की

, & & और || बराबर प्राथमिकता है, उसके बाद ; और &, जो बराबर प्राथमिकता है।

तो आपके आउटपुट की उम्मीद है।

1

मुझे लगता है कि आप इसे पहले से ही समझ चुके हैं। ऑपरेटर प्राथमिकता bash में इस तरह काम नहीं करती है। सब कुछ सिर्फ आपके उदाहरण में बाएं से दाएं चला जाता है।

2

बैश में, && और ||बराबर precendence और बाईं ओर सहयोगी है। Section 3.2.3 in the manual for details देखें।

तो, अपने उदाहरण के रूप में

$ (echo this || echo that) && echo other 

पार्स किया गया है और इस तरह केवल या रनों की बाएं हाथ की ओर, के बाद से वह सफल होता है दाएँ हाथ की ओर चलाने की जरूरत नहीं है।

+0

+1 पर समान प्राथमिकता दोनों को नोट करें यह वह उत्तर है जो मैं देने वाला था :) –

2

bash में बूलियन मूल्यांकन शॉर्ट सर्किट है: true || falsefalse संकार्य का मूल्यांकन कभी नहीं होगा, क्योंकि true संकार्य आपरेशन के परिणाम का निर्धारण करने के लिए पर्याप्त है। इसी तरह, false && truetrue ऑपरेंड का मूल्यांकन नहीं करेगा, क्योंकि यह अभिव्यक्ति के मान को नहीं बदल सकता है।

bash में बूलियन मूल्यांकन वास्तव में मुख्य रूप से ऑपरेटरों के सशर्त मूल्यांकन को नियंत्रित करने के लिए उपयोग किया जाता है, न कि उनके आदेश पर। विशिष्ट उपयोग do_foo || do_bar_if_foo_fails या do_foo && do_bar_only_if_foo_has_succeeded है।

कोई स्थिति में अपने echo that आदेश, निष्पादित किया जाएगा क्योंकि echo thistrue है और पूरे echo this || echo that उप अभिव्यक्ति के मूल्य निर्धारित करता है।

1

पढ़ा जा सकता है के समझाने इस क्या करता है:

echo this || echo that && echo other 

echo this || echo that ->echo that केवल तभी echo this असफल एस

&& echo other ->echo other केवल तभी && से पहले आदेश सफल होता है।

तो मूल रूप से:

echo this ---> सफलता ---->echo that ----> निष्पादित नहीं किया जाता क्योंकि echo this सफल --->echo other --->echo this || echo that सही ढंग से क्रियान्वित किया गया था कारण मार डाला जाता है ।