वे दोनों संकेत BASH को प्रतीकों के बाद एक और कमांड के साथ शुरू करते हैं, लेकिन क्या एक अलग अंतर है?
वे दोनों संकेत BASH को प्रतीकों के बाद एक और कमांड के साथ शुरू करते हैं, लेकिन क्या एक अलग अंतर है?
जवाबों:
इस लाइन के साथ:
command1 && command2
कमांड 2 को निष्पादित किया जाएगा यदि (और केवल यदि) कमांड 1 निकास स्थिति शून्य को लौटाता है, जबकि इस पंक्ति में:
command1 ; command2
दोनों कमांड 1 और कमांड 2 को परवाह किए बिना निष्पादित किया जाएगा। अर्धविराम आपको एक पंक्ति में कई कमांड टाइप करने की अनुमति देता है।
आप अपने लिए अंतर आजमा सकते हैं:
ls /invalid/path && echo "hello!"
चूंकि / अमान्य / पथ मौजूद नहीं है, इसलिए ls आपको निर्देशिका लिस्टिंग नहीं दिखा सकता है। यह एक त्रुटि संदेश के साथ विफल हो जाएगा: "ls: / अमान्य / पथ: ऐसी कोई फ़ाइल या निर्देशिका नहीं"। कमांड
की दूसरी छमाही (गूंज "हैलो!") को कभी भी निष्पादित नहीं किया जाता है, क्योंकि पहली छमाही विफल रही।
ls /invalid/path ; echo "hello!"
वही त्रुटि संदेश पहले की तरह दिखाई देता है, लेकिन इस बार, दूसरा भाग निष्पादित किया गया है !
ls: / अमान्य / पथ: ऐसी कोई फ़ाइल या निर्देशिका नहीं है
!
यह क्यों उपयोगी है?
मान लीजिए कि आप आर्काइव.टार्ग.जी नामक एक फाइल निकालना चाहते हैं, तो
आप कमांड का उपयोग कर सकते हैं tar zxvf archive.tar.gz && rm archive.tar.gz
।
यदि किसी कारण से पुरालेख का निष्कर्षण विफल हो जाता है, तो दूसरा भाग निष्पादित नहीं होता है! आप फिर से कोशिश कर सकते हैं
यदि तुम प्रयोग करते हो ; उसी स्थिति में, संग्रह हटा दिया जाता है और आप फिर से कोशिश नहीं कर सकते।
&&
इसका AND
अर्थ यह है कि दूसरा कमांड केवल तभी निष्पादित होगा जब पहले वाला सच लौटा हो (कोई त्रुटि नहीं)।
AND
निष्पादन के साथ 2 पैरामीटर अप्रासंगिक हो जाता है यदि पहला एक समान होता है false
और इसलिए अंतर्निहित कोड 2 पैरामीटर के स्थगित मूल्यांकन के लिए अनुकूलित हो जाता है जब तक कि यह नहीं जानता कि पहला क्या है।
&&
बस एक बाइनरी ऑपरेटर है, एक फ़ंक्शन। केवल "विशेष" बात यह है कि यह infix संकेतन है (जो कि इस तरह के अधिकांश ऑपरेटरों के लिए वैसे भी मानक है) और दूसरे ऑपरेंड के निष्पादन में देरी हुई। उस विलम्बित निष्पादन से वास्तव में इसे ऐसी चीज़ के रूप में उपयोग करने की क्षमता मिलती है जिसे वैचारिक रूप से इस संदर्भ में एक if
बयान के रूप में देखा जा सकता है , लेकिन यह इस तथ्य से दूर नहीं है कि यह मूल रूप से उपयोग किया गया उद्देश्य वास्तविक विवरण की शर्त के भीतर है if
। यहाँ उपयोग वास्तव में एक "हैक" का अधिक है।
a && b || c = (a && b) || c
। मूल्यांकन का सरल क्रम। वहाँ वास्तव में कोई रहस्य नहीं है। यदि आप उन्हें अपने विशिष्ट कार्यों की तरह लिखते हैं, तो यह बस की तरह दिखेगा or(and(a, b), c)
। यह तर्क एक के भीतर एक ही है if
क्योंकि जब यह सीधे कमांड लाइन में प्रवेश करने के साथ ही सशर्त &&
और ||
कर रहे हैं ऑपरेटरों , वे दो ऑपरेंड लेने के लिए और वे एक और लौट आते हैं।
अपडेट : मैंने कुछ संभावित ट्रैप को हाईलाइट करने के लिए स्क्रिप्ट के रूप में जोड़ा है:
क्योंकि किसी और ने "" "" का उल्लेख नहीं किया है, मैं करूँगा
Update2 : कुछ महत्वपूर्ण री-वर्डिंग यहाँ
&& एक "अगर" स्टेटमेंट की तरह है, तो "सच" का जवाब
|| है नहीं एक "अगर" बयान .. की "और" की तरह
|| "अगर" कथन का "तब" जैसा है जो "असत्य" का जवाब देता है
अधिक विशिष्ट, && $ का परीक्षण करता है? पिछले सबसे हाल ही में निष्पादित किए गए बयान का रिटर्न मान और && के तुरंत बाद स्टेटमेंट या सब-शेल पर नियंत्रण पास कर देता है ... यह केवल नियंत्रण पास करता है यदि $? सच हैं।
|| समान है, और अक्सर एक && कथन का अनुसरण करते हुए देखा जाता है, लेकिन यह पिछले सबसे हाल ही में निष्पादित बयान से एक झूठी वापसी मूल्य ($!) के लिए परीक्षण करता है ... एनबी! , नोट बेने! अच्छी तरह से नोट करें! .... यदि पूर्ववर्ती कथन एक && कथन है, जो आपके सत्य होने की अपेक्षा के बाद गलत साबित होता है, तो || झूठ का जवाब देंगे, इसलिए दोनों को एक ही पंक्ति में मिलाना जोखिम भरा हो सकता है
मैं जो मुख्य बिंदु बनाने की कोशिश कर रहा हूं वह एक गलती के संबंध में है जो मैंने किया है। अर्थात:
## [[स्थिति]] और& ए || B
, C / C ++ स्टाइल टर्नरी की तरह व्यवहार नहीं करता है। अर्थात:
// (शर्त)? A: B
"A" से "अप्रत्याशित" परिणामों के उदाहरणों के लिए नीचे दी गई स्क्रिप्ट देखें
मूल परीक्षण और && और || कथन सभी को एक ही पंक्ति में होना चाहिए ...
इस स्क्रिप्ट को यह देखने के लिए चलाएं कि & && का उपयोग करते समय कौन सी चीजें गलत हो सकती हैं? सबसे हाल ही में मार डाला बयान एक जैसा कि आप उम्मीद नहीं हो सकता है ..
[[हालत]] && गूंज हैलो || गूंज अलविदा .... आम तौर पर सुरक्षित है,
एक अच्छी तरह से गठित गूंज सच वापस आ जाएगी।
लेकिन क्या एक फ़ाइल तक पहुँचने के बारे में जो बाहर नहीं निकलता है?
#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo ======
((1==1)) && echo " ((1==1)) rc=$? ..&&.. condition is true" || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && echo " \$0 0 rc=$? ..&&.. condition is true" || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && echo " ((1!=1)) rc=$? ..&&.. condition is true" || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && echo " \$0 1 rc=$? ..&&.. condition is true" || echo " \$0 1 rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo ======
((1==1)) || echo " ((1==1)) rc=$? ..||.. condition is true" && echo " ((1==1)) rc=$? ..&&.. condition is false"
$0 0 || echo " \$0 0 rc=$? ..||.. condition is true" && echo " \$0 0 rc=$? ..&&.. condition is false"
((1!=1)) || echo " ((1!=1)) rc=$? ..||.. condition is true" && echo " ((1!=1)) rc=$? ..&&.. condition is false"
$0 1 || echo " \$0 1 rc=$? ..||.. condition is true" && echo " \$0 1 rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair'
echo ======
((1==1)) && (echo " ((1==1)) rc=$? ..&&.. condition is true"; $0 1) || echo " ((1==1)) rc=$? ..||.. condition is false"
$0 0 && (echo " \$0 0 rc=$? ..&&.. condition is true"; $0 2) || echo " \$0 0 rc=$? ..||.. condition is false"
((1!=1)) && (echo " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3) || echo " ((1!=1)) rc=$? ..||.. condition is false"
$0 1 && (echo " \$0 1 rc=$? ..&&.. condition is true"; $0 4) || echo " \$0 1 rc=$? ..||.. condition is false"
exit
प्रयत्न, कोशिश
झूठी और गूंज "नमस्ते"
तथा
असत्य ; इको "हैलो"
फर्क देखें
कमांड (फ़ंक्शन, स्क्रिप्ट के मामले में) के बाद &&
पहले कमांड के रिटेल (स्क्रिप्ट के मामले में फ़ंक्शन ) के आधार पर निष्पादित किया जाता है। यह पहली कमांड को 0 के मान को वापस करने के लिए मजबूर करता है, यदि सफल हो। हम आगे आदेशों को निष्पादित करने के लिए वापसी मूल्य की जांच कर सकते हैं।