किसी भी प्रोग्रामिंग भाषा में फंक्शन एक महत्वपूर्ण भूमिका निभाते हैं। कई वास्तविक प्रोग्रामिंग भाषाओं की तरह, बैश में ऐसे कार्य होते हैं जिनका उपयोग सीमित कार्यान्वयन के साथ किया जाता है।
फ़ंक्शन क्या हैं?
प्रोग्रामिंग में, फंक्शन्स को प्रोग्राम के उन वर्गों का नाम दिया जाता है जो एक विशिष्ट कार्य करते हैं। इस अर्थ में, फ़ंक्शन एक प्रकार की प्रक्रिया या दिनचर्या है। जब किसी फ़ंक्शन को कॉल किया जाता है तो प्रोग्राम कोड के वर्तमान भाग को छोड़ देता है और फ़ंक्शन के अंदर पहली पंक्ति को निष्पादित करना शुरू कर देता है। जब भी दोहराव वाला कोड हो या जब कोई कार्य दोहराया जाए, तो इसके बजाय किसी फ़ंक्शन का उपयोग करने पर विचार करें।
उदाहरण के लिए, उस मामले पर विचार करें जहां हमें किसी विशेष कार्यक्रम के कई चरणों में किसी संख्या का भाज्य ज्ञात करने की आवश्यकता होती है। हर बार पूरे कोड (फैक्टोरियल की गणना के लिए) लिखने के बजाय, हम कोड के उस हिस्से को लिख सकते हैं जो ब्लॉक के अंदर एक बार फैक्टोरियल की गणना करता है और कई मौकों पर उसका पुन:उपयोग करता है।
हम फंक्शन क्यों लिखते हैं?
- यह हमें कोड का पुन:उपयोग करने में मदद करता है।
- कार्यक्रम की पठनीयता में सुधार करें।
- कार्यक्रम के अंदर चरों का कुशल उपयोग।
- हमें कार्यक्रम का भाग-दर-भाग परीक्षण करने की अनुमति देता है।
- कार्यक्रम को उप-चरणों के समूह के रूप में प्रदर्शित करता है।
खोल स्क्रिप्ट में कार्य
शेल स्क्रिप्ट में फ़ंक्शन लिखने के लिए सामान्य सिंटैक्स में निम्नलिखित तरीके शामिल हैं।
function func_name { . . . commands . . . } or func_name ( ) { . . . commands . . . } Opening curly braces can also be used in the second line as well. func_name ( ) { . . . commands . . . }
आप इन फ़ंक्शन ब्लॉकों के अंदर मान्य कमांड लिखने के लिए हमेशा स्वतंत्र होते हैं जैसा कि हम सामान्य रूप से शेल स्क्रिप्ट में करते हैं। आइए अब एक छोटी सी फंक्शन वाली एक साधारण स्क्रिप्ट लिखने का प्रयास करें।
#!/bin/bash call_echo ( ) { echo ‘This is inside function’ } op=$1 if [ $# -ne 1 ]; then echo "Usage: $0 <1/0>" else if [ $1 = 0 ] ; then echo ‘This is outside function’ elif [ $1 = 1 ] ; then call_echo else echo ‘Invalid argument’ fi fi exit 0
फ़ंक्शन परिभाषा को इसके पहले कॉल से पहले होना चाहिए। कॉल करने से पहले 'फ़ंक्शन की घोषणा' करने जैसा कुछ नहीं है। और हम हमेशा फंक्शन्स को फंक्शन्स के अंदर नेस्ट कर सकते हैं।
नोट :- खाली फंक्शन लिखने से हमेशा सिंटैक्स त्रुटियाँ होती हैं।
जब एक ही फ़ंक्शन को कई बार परिभाषित किया जाता है, तो अंतिम संस्करण वह होता है जिसे कहा जाता है। आइए एक उदाहरण लेते हैं।
#!/bin/bash func_same ( ) { echo ‘First definition’ } func_same ( ) { echo ‘Second definition’ } func_same exit 0
पैरामीटर लेने और मान लौटाने वाले कार्य
आइए पैरामीटर लेने वाले कार्यों और मूल्यों को वापस करने पर विचार करके गहराई से जाएं। किसी फ़ंक्शन से मान वापस करने के लिए हम अंतर्निहित 'रिटर्न' शेल का उपयोग करते हैं। सिंटैक्स इस प्रकार है।
func_name ( ) { . . . commands . . . return $ret_val }
इसी तरह हम नीचे दिए गए अनुसार रिक्त स्थान से अलग किए गए कार्यों के लिए तर्क पारित कर सकते हैं।
func_name $arg_1 $arg_2 $arg_3
फ़ंक्शन के अंदर हम तर्कों को $ 1, $ 2, $ 3 और इसी तरह से एक्सेस कर सकते हैं। अधिक स्पष्टता जोड़ने के लिए फ़ंक्शन का उपयोग करके अधिकतम दो पूर्णांक खोजने के लिए निम्न उदाहरण स्क्रिप्ट देखें।
#!/bin/bash USG_ERR=7 max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then echo $1 else echo $2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 x if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 else err_str fi else err_str fi exit 0
उपरोक्त थोड़ा जटिल लगता है, लेकिन अगर हम पंक्तियों के माध्यम से पढ़ते हैं तो यह आसान है। पहले नेस्टेड if-else if लाइन्स वेलिडेशन उद्देश्यों के लिए यानी रेगुलर एक्सप्रेशन की मदद से संख्या और तर्कों के प्रकार की जाँच करने के लिए। उसके बाद हम फ़ंक्शन को दो कमांड लाइन तर्कों के साथ कॉल करते हैं और वहां परिणाम प्रदर्शित करते हैं। ऐसा इसलिए है क्योंकि हम किसी फ़ंक्शन से बड़े पूर्णांक नहीं लौटा सकते। इस समस्या को हल करने का दूसरा तरीका परिणाम को फ़ंक्शन के अंदर संग्रहीत करने के लिए वैश्विक चर का उपयोग करना है। नीचे दी गई स्क्रिप्ट इस विधि की व्याख्या करती है।
#!/bin/bash USG_ERR=7 ret_val= max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then ret_val=$1 else ret_val=$2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 echo $ret_val else err_str fi else err_str fi exit 0
अब कुछ रोमांचक समस्याओं का प्रयास करें जिन्हें पिछली शेल स्क्रिप्टिंग श्रृंखला में निम्नानुसार कार्यों का उपयोग करके समझाया गया था।
- मूल Linux शेल स्क्रिप्टिंग भाषा युक्तियों को समझें - भाग I
- 5 शैल स्क्रिप्ट्स शेल प्रोग्रामिंग सीखने के लिए Linux के नए शौक़ीन लोगों के लिए - भाग II
- लिनक्स बैश स्क्रिप्टिंग की दुनिया के माध्यम से नौकायन - भाग III
- लिनक्स शेल प्रोग्रामिंग का गणितीय पहलू - भाग IV
- शैल स्क्रिप्टिंग भाषा में गणितीय अभिव्यक्तियों की गणना करना - भाग V
मैं अगले भाग में स्थानीय चर, रिकर्सन इत्यादि जैसे कार्यात्मक सुविधाओं के बारे में अधिक अंतर्दृष्टि के साथ वापस आऊंगा। टिप्पणियों से अपडेट रहें।