आप शेल फ़ंक्शन से एक मनमाना परिणाम नहीं लौटा सकते। आप केवल एक स्थिति कोड लौटा सकते हैं, जो 0 और 255 के बीच पूर्णांक है। (जब आप किसी बड़े मान को पास कर सकते हैं return
, तो यह modulo 256 से छोटा है।) सफलता को इंगित करने के लिए मान 0 होना चाहिए और विफलता को इंगित करने के लिए एक अलग मान; सम्मेलन द्वारा आपको 1 और 125 के बीच त्रुटि कोड से चिपके रहना चाहिए, क्योंकि उच्च मूल्यों का एक विशेष अर्थ है (126 और 127 के लिए खराब बाहरी कमांड, उच्च मूल्यों के लिए एक संकेत द्वारा मारा गया)।
चूंकि आप यहां हां-या-कोई परिणाम नहीं दे रहे हैं, इसलिए एक स्थिति कोड उपयुक्त है। चूंकि flag
सफलता या विफलता का संकेत मिलता है, इसलिए आपको सफलता के लिए 0 और असफलता के लिए 1 (आपने जो लिखा है) के पारंपरिक मूल्यों का उपयोग करना चाहिए। आप एक if स्टेटमेंट में सीधे अपने फंक्शन का उपयोग कर सकते हैं।
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
यदि आपको विफलता कोड के बीच भेदभाव करने की आवश्यकता है, तो फ़ंक्शन को सीधे कॉल करें। इसके लौटने के तुरंत बाद, विफलता कोड में उपलब्ध है $?
। फिर आप इसे केस स्टेटमेंट के साथ देख सकते हैं:
valNum "$num"
case $? in …
यदि आपको बाद में स्थिति कोड का उपयोग करने की आवश्यकता है, तो इसे $?
अगले आदेश द्वारा अधिलेखित होने से पहले दूसरे चर में सहेजें ।
valNum "$num"
valNum_status=$?
आपने जो लिखा वह काम नहीं किया क्योंकि कमांड प्रतिस्थापन $(…)
फ़ंक्शन के आउटपुट में फैलता है, जो आपके कोड में या तो त्रुटि संदेश है या खाली है, कभी नहीं 1
।
यदि आपको किसी शेल कोड से स्थिति कोड से अधिक जानकारी पास करने की आवश्यकता है, तो आपके पास दो संभावनाएँ हैं:
- मानक आउटपुट पर कुछ पाठ प्रिंट करें, और फ़ंक्शन को कमांड प्रतिस्थापन में कॉल करें:
$(valNum "$num")
- फ़ंक्शन के अंदर एक या अधिक चर को असाइन करें और बाद में उन चर को पढ़ें।