यदि आपको केवल यह जानना है कि कमांड सफल हुआ या विफल हुआ, तो परीक्षण को परेशान न करें $?, बस सीधे कमांड का परीक्षण करें । जैसे । :
if some_command; then printf 'some_command succeeded\n'else printf 'some_command failed\n'fi
और आउटपुट को एक चर में असाइन करने से रिटर्न वैल्यू में बदलाव नहीं होता है (ठीक है, जब तक कि यह अलग तरह से व्यवहार नहीं करता है जब स्टडआउट निश्चित रूप से टर्मिनल नहीं है) ।
if output=$(some_command); then printf 'some_command succeded, the output was «%s»\n' "$output"fi
अधिकांश मामलों के लिए, चेन कमांड के लिए और निर्माण का उपयोग करना आसान है जो एक दूसरे पर निर्भर होना चाहिए । तो cd /nonexistant && echo success! होगा नहीं इको सफलता क्योंकि आदेश से पहले टूट जाता है&;&;. इसका परिणाम है//, जहां cd /nonexistant || echo failहोगा इको विफल क्योंकि सीडी विफल। (यह उपयोगी हो जाता है यदि आप ||निकास जैसी किसी चीज़ का उपयोग करते हैं, जो पिछली कमांड विफल होने पर स्क्रिप्ट को समाप्त कर देगा । )
यह ध्यान दिया जाना चाहिए कि if...then...fi और &&/|| दृष्टिकोण का प्रकार कमांड द्वारा लौटाए गए निकास स्थिति से संबंधित है जिसे हम परीक्षण करना चाहते हैं( सफलता पर 0 ); हालाँकि, कुछ कमांड गैर-शून्य निकास स्थिति नहीं लौटाते हैं यदि कमांड विफल हो गया या इनपुट से निपट नहीं सका । इसका मतलब है कि सामान्य if और &&/|| दृष्टिकोण उन विशेष आदेशों के लिए काम नहीं करेगा ।
उदाहरण के लिए, लिनक्स जीएनयू पर file अभी भी 0 के साथ बाहर निकलता है अगर इसे तर्क के रूप में एक गैर-मौजूदा फ़ाइल प्राप्त हुई और find निर्दिष्ट फ़ाइल उपयोगकर्ता का पता नहीं लगा सका ।
$ find . -name "not_existing_file" $ echo $?0$ file ./not_existing_file ./not_existing_file: cannot open `./not_existing_file' (No such file or directory)$ echo $?0
ऐसे मामलों में, एक संभावित तरीका जिससे हम स्थिति को संभाल सकते हैं, वह है पढ़ना stderr/stdin संदेश, उदाहरण के लिए वे जो लौट आए file कमांड, या कमांड के आउटपुट को पार्स करें जैसे find. उस उद्देश्य के लिए, case बयान का इस्तेमाल किया जा सकता.
$ file ./doesntexist | while IFS= read -r output; do > case "$output" in > *"No such file or directory"*) printf "%s\n" "This will show up if failed";;> *) printf "%s\n" "This will show up if succeeded" ;;> esac> doneThis will show up if failed$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi File not found
जैसा कि कई अन्य उत्तरों में बताया गया है, का एक सरल परीक्षण $? इस तरह करेंगे
if [ $? -eq 0 ]; then something; fi
यदि आप कमांड का परीक्षण करना चाहते हैं विफल, आप एक छोटे संस्करण का उपयोग कर सकते हैं bash (लेकिन शायद ओवरकिल) इस प्रकार है:
if (($?)); then something; fi
यह उपयोग करके काम करता है (( )) अंकगणित मोड, इसलिए यदि आदेश वापस आ गया success, यानी $? = 0 फिर परीक्षण का मूल्यांकन करता है ((0)) जो परीक्षण के रूप में false, अन्यथा यह वापस आ जाएगा true.
के लिए परीक्षण करने के लिए सफलता, आप उपयोग कर सकते हैं: