बैश या शेल स्क्रिप्ट में फ़ॉर्वर्ड फ़ंक्शन की घोषणा?


95

वहाँ में ऐसी बात है bashया कुछ इसी तरह कम से कम (काम के आसपास) आगे घोषणाओं, उदाहरण के लिए अच्छी तरह से C / C ++ में जाना जाता है, की तरह?

या ऐसी कोई चीज़ है क्योंकि उदाहरण के लिए इसे हमेशा एक पास (लाइन के बाद लाइन) में निष्पादित किया जाता है?

यदि आगे की घोषणाएं नहीं हैं, तो मुझे अपनी स्क्रिप्ट को पढ़ने में आसान बनाने के लिए क्या करना चाहिए। यह लंबे समय तक है और ये फ़ंक्शन शुरुआत में वैश्विक चर के साथ मिश्रित, मेरी स्क्रिप्ट को बदसूरत और पढ़ने / समझने में कठिन बनाते हैं)? मैं ऐसे मामलों के लिए कुछ प्रसिद्ध / सर्वोत्तम प्रथाओं को सीखने के लिए कह रहा हूं।


उदाहरण के लिए:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}

जवाबों:


190

बड़ा सवाल है। मैं अपनी अधिकांश लिपियों के लिए इस तरह एक पैटर्न का उपयोग करता हूं:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

आप ऊपर से नीचे तक कोड पढ़ सकते हैं, लेकिन यह वास्तव में अंतिम पंक्ति तक निष्पादित करना शुरू नहीं करता है। "$@"मुख्य () में पास होकर आप कमांड-लाइन आर्ग्युमेंट्स तक पहुँच सकते हैं $1, $2जैसे कि आप सामान्य रूप से करेंगे।


3
नमस्ते, आप अपने उदाहरण में foo / bar / baz के बीच साझा किए जाने वाले डेटा को कैसे बनाते हैं? आमतौर पर मैं इसे स्क्रिप्ट के शीर्ष पर रखता हूं। क्या फ़ंक्शंस का उपयोग करते समय यह अभी भी मामला है? या वैश्विक डेटा को मुख्य रूप से रखना बेहतर है, और फिर इसे तर्क के रूप में foo / bar / baz में पास करें? सबसे अच्छा अभ्यास क्या है?
बोडैसिडो

4
मुझे तर्क पसंद हैं। उस पर रोक लगाते हुए, मैं mainठीक इसके बाद main(जैसे, setupया parseArguments) एक फ़ंक्शन में वैश्विक चर सेट करूंगा । मैं वैश्विक वैरिएबल के ऊपर सेट होने से बचता हूं main- कोड बाहर नहीं जाना चाहिए main
जॉन कुगेलमैन

यह if _ _ name _ _ == "_ _ main _ _": main()अजगर में क्या करता है के लिए कुछ हद तक अनुरूप लगता है
Sergiy Kolodyazhnyy

यह भी शानदार है जब आपकी स्क्रिप्ट का परीक्षण करने के लिए चमगादड़ जैसे उपकरण का उपयोग करते हुए , कार्यों में सब कुछ तोड़कर व्यक्तिगत घटकों के परीक्षण को बहुत आसान बना देता है। ब्लॉग पोस्ट
Dragon 788

30

जब मेरी बैश स्क्रिप्ट बहुत बढ़ जाती है, तो मैं एक शामिल तंत्र का उपयोग करता हूं:

फ़ाइल allMyFunctions:

foo() {
}

bar() {
}

baz() {
}

फ़ाइल main:

#!/bin/bash

. allMyfunctions

foo
bar
baz

27
व्यक्तिगत रूप से, जब एक शेल स्क्रिप्ट पिछले एक फ़ाइल से बढ़ने लगती है, तो मैं एक अलग भाषा में स्विच करता हूं ;-)
जोआचिम सॉर

यह उपयोग करने के लिए बेहतर नहीं होगा source allMyfunctions?
pydoge

4
@pydoge: sourcePOSIX- शिकायत नहीं है। एक उपनाम के रूप में bashपरिभाषित करता sourceहै .: वे कार्यात्मक रूप से समतुल्य हैं।
मौविसील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.