ऑपरेटर और& अगली कमांड को निष्पादित करता है यदि पिछली कमांड में एक सफल निष्पादन था, (एक्जिट कोड ($?) 0 = तार्किक सत्य लौटा दिया गया)।
प्रपत्र में A && B || C
, आदेश (या हालत) एक मूल्यांकन किया जाता है और अगर एक रिटर्न सच (सफलता, बाहर निकलें कोड 0) तो आदेश बी निष्पादित किया जाता है। यदि A विफल हो जाता है (इस प्रकार गलत - 0 के अलावा बाहर निकलने का कोड) और / या B विफल हो जाता है ( गलत वापस लौटता है ) तो कमांड C निष्पादित हो जाएगी।
इसके अलावा &&
ऑपरेटर एक के रूप में प्रयोग किया जाता है और हालत की जांच और ऑपरेटर में ||
की तरह काम करता है या हालत की जाँच में।
आप अपनी स्क्रिप्ट के साथ क्या करना चाहते हैं, इस पर निर्भर करते हुए, फॉर्म A && B || C
का उपयोग आपके उदाहरण की तरह स्थिति जांच के लिए किया जा सकता है या चेन कमांड्स के लिए उपयोग किया जा सकता है और कमांड की एक श्रृंखला सुनिश्चित करने के लिए निष्पादित किया जा सकता है यदि पिछले कमांड में एक सफल निकास कोड 0 था ।
यही कारण है कि ऐसा लगता है कि आदेश देखने के लिए आम बात है यह है:
do_something && do_something_else_that_depended_on_something
।
उदाहरण:
apt-get update && apt-get upgrade
यदि अद्यतन विफल रहता है, तो अपग्रेड निष्पादित नहीं किया जाता है, (वास्तविक दुनिया में समझ में आता है ...)।
mkdir test && echo "Something" > test/file
भाग echo "Something"
तभी निष्पादित किया जाएगा जब mkdir test
सफल रहा और ऑपरेशन से बाहर निकलें कोड 0 ।
./configure --prefix=/usr && make && sudo make install
आमतौर पर जॉब को कंपाइल करने के लिए जरूरी डिपेंडेंट कमांड्स को एक साथ मिलाने पर।
यदि आप "चेन" से ऊपर को लागू करने का प्रयास करते हैं, तो - तब - अन्यथा आपको एक सरल कार्य के लिए बहुत अधिक कमांड और चेक (और इस प्रकार लिखने के लिए अधिक कोड - गलत होने के लिए अधिक चीजें) की आवश्यकता होगी।
इसके अलावा, ध्यान रखें कि && के साथ जंजीर कमांड और || बाईं ओर दाईं ओर शेल द्वारा पढ़ा जाता है। आपको कुछ पिछले आदेशों के सफल आउटपुट पर अगले चरण पर निर्भर करने के लिए कोष्ठक के साथ समूह कमांड और कंडीशन चेक की आवश्यकता हो सकती है। उदाहरण के लिए इसे देखें:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
या एक वास्तविक जीवन उदाहरण:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
ध्यान रखें कि कुछ कमांड निष्पादित की गई प्रक्रिया के आधार पर अलग-अलग निकास कोड लौटाते हैं, या उनके कार्यों के आधार पर अलग-अलग कोड लौटाते हैं, (उदाहरण के लिए GNU कमांड diff
, 1 अगर दो फाइलें अलग-अलग होती हैं, और 0 यदि वे नहीं करते हैं)। इस तरह के आदेशों की देखभाल के लिए && और || ।
इसके अलावा बस सभी पहेली को एक साथ करने के लिए, ;
ऑपरेटर का उपयोग करने वाले आदेशों को ध्यान में रखें । एक प्रारूप के साथ A;B;C
सभी आदेशों को श्रृंखला में निष्पादित किया जाएगा, चाहे कोई भी कमांड का निकास कोड हो A
और B
।