कैसे एक समारोह में बाहर निकलने के लिए


100

यदि आप किसी फ़ंक्शन को पूरी स्क्रिप्ट को मारे बिना सही हैं, तो फ़ंक्शन से बाहर कैसे निकलेंगे, फ़ंक्शन को कॉल करने से पहले बस वापस लौटें।

उदाहरण

# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to

function FUNCT {
  if [ blah is false ]; then
    exit the function and go up to A
  else
    keep running the function
  fi
}

जवाबों:


139

उपयोग:

return [n]

से help return

वापसी : वापसी [एन]

Return from a shell function.

Causes a function or sourced script to exit with the return value
specified by N.  If N is omitted, the return status is that of the
last command executed within the function or script.

Exit Status:
Returns N, or failure if the shell is not executing a function or script.

20
ध्यान दें कि यदि आपने set -eअपनी स्क्रिप्ट के शीर्ष पर और अपने return 1या किसी अन्य नंबर को 0 के अलावा सेट किया है, तो आपकी पूरी स्क्रिप्ट बाहर निकल जाएगी।
येवगेनी ब्रिकमैन

1
@YevgeniyBrikman केवल तभी सही है जब फ़ंक्शन में त्रुटि अप्रत्याशित है। यदि फ़ंक्शन को उदाहरण के लिए उपयोग किया जाता है, ||तो एक गैर-अक्षीय कोड वापस करना संभव है और अभी भी स्क्रिप्ट निष्पादित करना जारी है।
दान पसारो

1
@DanPassaro यूप, निश्चित रूप से समाधान संभव हैं, लेकिन मैं सिर्फ यह कहना चाहता था कि set -eगैर-शून्य मानों के साथ अतिरिक्त देखभाल की आवश्यकता होती है , क्योंकि मुझे अतीत में आश्चर्य से पकड़ा गया था।
येवगेनी ब्रिकमैन

20

returnऑपरेटर का उपयोग करें :

function FUNCT {
  if [ blah is false ]; then
    return 1 # or return 0, or even you can omit the argument.
  else
    keep running the function
  fi
}

2

यदि आप किसी बाहरी फ़ंक्शन से exitआईएनजी त्रुटि के बिना लौटना चाहते हैं तो आप इस ट्रिक का उपयोग कर सकते हैं:

do-something-complex() {
  # Using `return` here would only return from `fail`, not from `do-something-complex`.
  # Using `exit` would close the entire shell.
  # So we (ab)use a different feature. :)
  fail() { : "${__fail_fast:?$1}"; }

  nested-func() {
      try-this || fail "This didn't work"
      try-that || fail "That didn't work"
  }
  nested-func
}

इसे आजमा रहे हैं:

$ do-something-complex
try-this: command not found
bash: __fail_fast: This didn't work

इसका अतिरिक्त लाभ / दोष है जिसे आप वैकल्पिक रूप से इस सुविधा को बंद कर सकते हैं __fail_fast=x do-something-complex:।

ध्यान दें कि यह सबसे बाहरी फ़ंक्शन को 1 वापस करने का कारण बनता है।


क्या आप आंतरिक कार्य के बारे में अधिक बता सकते हैं failकि यहाँ बृहदान्त्र क्या कर रहा है?
ब्रुक होंग

:एक अंतर्निहित बैश ऑपरेटर "नहीं-op" है। यह अभिव्यक्ति का मूल्यांकन करता है लेकिन इसके साथ कुछ भी नहीं करता है। मैं इसका उपयोग चर प्रतिस्थापन करने के लिए कर रहा हूँ जो कि अगर चर को परिभाषित नहीं किया गया है, जो कि स्पष्ट रूप से नहीं है।
इलियट कैमरन

धन्यवाद। क्या मैं इनपुट पैरामीटर की जांच करने के लिए अभिव्यक्ति को कुछ अन्य अभिव्यक्ति में बदल सकता हूं do-something-complex? <code> checkPara () {यदि [$ 1-$ 2]; फिर गूंज $ 3; फाई; } do-something-complex () {checkPara $ # 1 "उपयोगकर्ता को फ़ंक्शन का उपयोग करने की चेतावनी देने के लिए यहां कुछ संदेश।" इको "हां"} </ code> मैं do-something-complexउपयोगकर्ता को कुछ संदेश दिखाऊंगा और फ़ंक्शन में कोई पैरामीटर न होने पर तुरंत वापस आ जाऊंगा।
ब्रुक होंग

हां, आप ऐसा कुछ कर सकते हैं, जहां फ़ंक्शन के पूरे ढेर से बाहर निकलने के लिए checkParaमेरे failफ़ंक्शन का उपयोग किया जाएगा ।
इलियट कैमरन

यह काम नहीं कर रहा है। (पुनश्च: codeस्टैकओवरफ्लो पर टिप्पणी में ब्लॉक काम नहीं करता है)। इसके बाद भी चलता रहता है checkPara
ब्रुक होंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.