केवल यही कारण है कि आप $?
एक [
कमांड के तर्क के रूप में उपयोग करना चाहते हैं (चाहे वह [
कमांड किसी if
स्टेटमेंट के भाग में है या नहीं) जब आप किसी विशिष्ट रिटर्न स्टेटस में भेदभाव करना चाहते हैं, जैसे:
until
cmd
[ "$?" -gt 1 ]
do
something
done
उन सभी के लिए वाक्य रचना if
, while
, until
... बयान है
if cmd-list1
then cmd-list2
else cmd-list3
fi
कौन चलाता cmd-list2
है, तो cmd-list1
सफल हुआ या cmd-list3
अन्यथा।
[ "$?" -eq 0 ]
आदेश नो-सेशन है। यह $?
0 पर सेट होता है यदि $?
0 है, और $?
गैर-शून्य पर यदि यह गैर-शून्य है।
यदि आप कुछ चलाना चाहते हैं यदि cmd
असफल हो, तो यह है:
if ! cmd
then ...
fi
आम तौर पर, आपको यह $?
बताने की जरूरत नहीं है कि किस मूल्य का मतलब क्या है true
या अकेले false
। केवल मामले ऐसे हैं जैसे मैंने ऊपर कहा है कि यदि आपको किसी विशिष्ट मूल्य पर भेदभाव करने की आवश्यकता है, या यदि आपको इसे बाद में सहेजने की आवश्यकता है (उदाहरण के लिए इसे किसी फ़ंक्शन के रिटर्न मान के रूप में)
f() {
cmd; ret=$?
some cleanup
return "$ret"
}
यह भी याद रखें कि एक वैरिएबल को छोड़ना स्प्लिट + ग्लोब ऑपरेटर है। यह उस ऑपरेटर को यहां लागू करने के लिए समझ में नहीं आता है, इसलिए यह होना चाहिए:
[ "$?" -ne 0 ]
नहीं [ $? -ne 0 ]
, अकेले जाने दो [$? -ne 0 ]
(जो केवल [
कमांड को लागू करेगा यदि $IFS
पहले वर्ण को शामिल करने के लिए हुआ हो $?
)।
यह भी ध्यान दें कि किसी फ़ंक्शन को परिभाषित करने का बॉर्न तरीका function-name()
एक कमांड के सामने रहना है। सिवाय इसके कि कवच की तरह हर बॉर्न में मामला है bash
और yash
(और के हाल के संस्करणों posh
) जो केवल एक यौगिक आदेश (मिश्रित आदेशों जा रहा है की अनुमति देते हैं {...}
या (...)
या तरह बातें for...done
, if...fi
...
function foo { ... }
है ksh
समारोह परिभाषा वाक्य रचना। ऐसा कोई कारण नहीं है कि आप इसका उपयोग क्यों करना चाहते हैं।
आपका कोड आंशिक रूप से (POSIXly) लिखा जा सकता है:
foo() (
cd -P -- "$FOOBAR" || return # what if the cd failed!
if
<some command>
then
echo 'OK!'
else
echo 'Nope!'
fi
)
यह भी ध्यान दें कि इसके cd
बिना -P
बहुत ही विशेष अर्थ है (पथ जो ..
किसी भी अन्य कमांड से अलग घटकों को संभालता है ), इसलिए भ्रम से बचने के लिए इसे स्क्रिप्ट में शामिल करना बेहतर है।
(कि समारोह रिटर्न false
अगर cd
विफल रहता है, लेकिन यदि नहीं <some command>
विफल रहता है)।
$?
किसीif
कथन के साथ 0 के बराबर परीक्षण करना व्यर्थ है, तोif
एक कमांड की अपेक्षा करता है और यदि कहा जाता है कि0
यह रिटर्न देता है , तो यह ब्लॉक में कोड चलाता है। इसलिएif true; then echo hello; fi
गूंज नमस्ते के बाद से आदेश होगाtrue
लौटे0
।