जवाबों:
जैसे दूसरों ने कहा है, आप ऐसा नहीं कर सकते।
लेकिन अगर आप कोड को एक फ़ाइल में व्यवस्थित करना चाहते हैं ताकि मुख्य कार्यक्रम फ़ाइल के शीर्ष पर हो, और अन्य फ़ंक्शन नीचे परिभाषित किए गए हैं, तो आप इसे एक अलग mainफ़ंक्शन करके कर सकते हैं ।
उदाहरण के लिए
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
जब हम mainफ़ाइल के अंत में कॉल करते हैं, तो सभी फ़ंक्शन पहले से ही परिभाषित होते हैं। फ़ंक्शन में दिखाई देने वाली स्क्रिप्ट की कमांड लाइन तर्क बनाने के "$@"लिए स्पष्ट रूप से पारित करना mainआवश्यक है।
exitकॉल टू मेन के रूप में एक ही लाइन पर स्पष्ट अनिवार्य नहीं है, लेकिन एक रनिंग स्क्रिप्ट को स्क्रिप्ट फ़ाइल में संशोधित होने से बचाने के लिए उपयोग किया जा सकता है। इसके बिना, शेल mainरिटर्न के बाद स्क्रिप्ट फ़ाइल से कमांड पढ़ना जारी रखने का प्रयास करेगा । ( इसे निष्पादित करने से पहले संपूर्ण शेल स्क्रिप्ट कैसे पढ़ें? देखें )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"मुख्य फ़ंक्शन को कॉल करने के लिए उपयोग करता हूं ताकि मैं इसे किसी अन्य स्क्रिप्ट Mainमें निष्पादित किए बिना ही स्रोत कर सकूं। फिर मैं या तो कार्यों का पुन: उपयोग कर सकता हूं या उन्हें जांचने के लिए परीक्षण लिख सकता हूं।
main "$@"; exit( exitउसी लाइन पर main) के साथ भी उपयोगी है क्योंकि फाइल की व्याख्या की जा रही है, जबकि इसे संरक्षित किया जा रहा है।
exitउसी लाइन पर डालते हैं जैसा कि mainहम सुनिश्चित करते हैं कि शेल mainरिटर्न के बाद फ़ाइल से फिर से कुछ भी नहीं पढ़ेगा ।
main; exit, तो इससे कोई फर्क नहीं पड़ता है , main; exit $?या main <EOF>, सभी मामलों mainमें स्क्रिप्ट के निकास कोड के रूप में निकास कोड का उपयोग किया जाता है। exitकिसी स्क्रिप्ट के चलते समय संपादित करता है, तो सिर्फ बातें में गड़बड़ हो रही रोकने के लिए किया जाएगा।
नहीं, फ़ंक्शन को कॉल करने के समय गोले के वातावरण में मौजूद होना चाहिए।
Google की "शेल स्टाइल गाइड" में इसके लिए एक निश्चितता है:
एक फ़ंक्शन जिसे
mainस्क्रिप्ट कहा जाता है, उसके लिए आवश्यक है कि कम से कम एक अन्य फ़ंक्शन शामिल हो।
स्क्रिप्ट के बहुत अंत में, सभी फ़ंक्शन के बाद, केवल एक फ़ंक्शन में कथन नहीं, आपके पास होगा
main "$@"
यह mainफ़ंक्शन को स्क्रिप्ट के दिए गए सभी मापदंडों के साथ कॉल करेगा । mainसमारोह स्क्रिप्ट के शीर्ष पर स्थित किया जा सकता है (शैली गाइड तल पर यह डाल करने के लिए कहते हैं, लेकिन फिर, यह बहुत सी बातें कहते हैं)।
जब शेल mainकॉल पर जाता है , तो स्क्रिप्ट में सभी फ़ंक्शन पार्स किए गए हैं और इसलिए इसे mainफ़ंक्शन के भीतर से कॉल किया जा सकता है।
नहीं, फ़ंक्शंस का उपयोग करने से पहले उन्हें घोषित किया जाना चाहिए। शैल स्क्रिप्ट लाइन द्वारा लाइन पढ़ी जाती हैं और लाइन द्वारा लाइन पर कार्रवाई की जाती हैं; इसलिए एक फ़ंक्शन मौजूद नहीं है जब तक कि इसकी घोषणा को निष्पादित नहीं किया गया है।
Cआराम है।
. yourfile)।
ifएक फ़ंक्शन के बाहर नंगे बयान नहीं हैं । जब आप कॉल करते हैं तो फ़ंक्शन को -containing फ़ंक्शन की घोषणा करते समय परिभाषित नहीं किया जाता है । if
शेल में declaringफ़ंक्शन की कोई अवधारणा नहीं है। इसलिए आपके पास आगे की घोषणा नहीं हो सकती है।
एक परिणाम के रूप में, आपको इसे लागू करने से पहले शेल द्वारा फ़ंक्शन कार्यान्वयन को पढ़ने की आवश्यकता है।
autoload fफ़ंक्शन घोषित करता है, लेकिन इसका शरीर केवल पहले आह्वान पर लोड होता है)। bashहालांकि यह ओपी पर लागू नहीं होता है ।