केवल यही कारण है कि आप $?एक [कमांड के तर्क के रूप में उपयोग करना चाहते हैं (चाहे वह [कमांड किसी 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।