Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Bash प्रोग्रामिंग

शेल फंक्शनैलिटी में महारत: शेल स्क्रिप्टिंग में उन्नत तकनीकें - भाग VII

"शेल स्क्रिप्ट में फंक्शन को समझना और लिखना" पर मेरा पिछला लेख आपको शेल स्क्रिप्ट के तहत फंक्शन लिखने के बारे में एक बुनियादी विचार दे सकता है। अब लोकल वेरिएबल्स और रिकर्सन जैसे कार्यात्मक फीचर्स में गहराई से जाने का समय है।

शेल फंक्शनैलिटी में महारत: शेल स्क्रिप्टिंग में उन्नत तकनीकें - भाग VII

लोकल वेरिएबल्स

क्या एक वेरिएबल को लोकल बनाता है? यह उस विशेष ब्लॉक पर निर्भर करता है जहां वेरिएबल घोषित किया गया है। local के रूप में घोषित एक वेरिएबल उस कोड ब्लॉक से पहुंच योग्य होगा जहां यह प्रकट होता है यानी इसका स्कोप लोकल है। इस चीज़ को समझाने के लिए आइए नीचे एक उदाहरण देखें।

#!/bin/bash func( ) { local i=10 j=20 echo "i from func = $i" echo "j from func = $j" } echo "i outside func = $i" echo "j outside func = $j" func echo "i outside func = $i" echo "j outside func = $j" exit 0

उपरोक्त स्क्रिप्ट को निष्पादित करने पर आउटपुट होगा।

i outside func = j outside func = i from func = 10 j from func = 20 i outside func = j outside func = 20

ऐसा इसलिए है क्योंकि पहले 2 इको स्टेटमेंट निष्पादित होने तक फंक्शन func को अभी तक कॉल नहीं किया गया था। फंक्शन func को कॉल करने के बाद वही 2 इको स्टेटमेंट एक अलग परिणाम देते हैं। अब वेरिएबल j, जिसे func के अंदर घोषित किया गया था और लोकल नहीं था, बाद में एक्सेस किया जा सकता था।

इस प्रकार j का मान 20 हो जाता है। लोकल वेरिएबल i का क्या? चूंकि इसका स्कोप फंक्शन func के अंदर था, मान 10 को बाहर से एक्सेस नहीं किया जा सका। ध्यान दें कि func के अंदर सामान्य रूप से घोषित वेरिएबल j डिफ़ॉल्ट रूप से ग्लोबल है।

अब आप लोकल वेरिएबल्स से परिचित हैं और फंक्शन ब्लॉक के अंदर उनका उपयोग कैसे करें। आइए फंक्शन के तहत सबसे दिलचस्प खंड, रिकर्सन पर चलते हैं।

रिकर्सन क्या है?

एक फंक्शन जो खुद को कॉल करता है, आमतौर पर रिकर्सन प्रक्रिया कहलाता है। या इसे उसी एल्गोरिथम के सरल संस्करण का उपयोग करके एल्गोरिथम व्यक्त करने के रूप में परिभाषित किया जा सकता है। एक संख्या का फैक्टोरियल खोजने के उदाहरण पर विचार करें। हम जानते हैं कि n! = 1 x 2 x 3 x ... x (n-1) x n। इस प्रकार हम एक पुनरावृत्ति संबंध लिख सकते हैं:

n! = (n-1)! x n

तो हमारे लिए उसी फंक्शन को रिकर्सिवली कॉल करना और प्रत्येक कॉल से रिटर्न वैल्यू का उपयोग करके पिछले परिणाम से गुणा करना आसान है, यानी

5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1

लोकल वेरिएबल्स का उपयोग करके रिकर्सन

यहां हम लोकल वेरिएबल्स और रिकर्सन का उपयोग करके एक संख्या का फैक्टोरियल खोजने के लिए एक स्क्रिप्ट लिखने का प्रयास करते हैं।

#!/bin/bash fact( ) { local num=$1 if [ $num -eq 0 ]; then ret=1 else temp=$((num-1)) fact $temp ret=$((num*$?)) fi return $ret } fact 5 echo "Factorial of 5 = $?" exit 0

num एक लोकल वेरिएबल है जिसका उपयोग प्रत्येक कॉल पर प्रत्येक n-1 मान को संग्रहीत करने के लिए किया जाता है। यहां बेस कंडीशन जांचती है कि संख्या शून्य के बराबर है या नहीं (चूंकि 0! = 1 और फैक्टोरियल नकारात्मक संख्याओं के लिए परिभाषित नहीं है)। इस बेस कंडीशन पर पहुंचने पर यह मान 1 अपने कॉलर को लौटाता है। अब num = 1 और ret = 1 x 1।

इस क्षण यह 1 अपने कॉलर को लौटाता है। अब num = 2 और ret = 2 x 1 और इसी तरह। अंत में जब num = 5 रिटर्न वैल्यू 24 होगी और अंतिम परिणाम ret = 5 x 24 होगा। अंतिम परिणाम 120 प्रारंभिक कॉलर स्टेटमेंट को पास हो जाता है और प्रदर्शित होता है।

उपरोक्त स्क्रिप्ट में एक समस्या है। जैसा कि मैंने पिछले लेख में बताया था, फंक्शन बड़े इंटीजर नहीं लौटा सकते। इसलिए इसका समाधान ढूंढना उपयोगकर्ताओं पर छोड़ दिया गया है।

प्रश्न: क्या हम लोकल वेरिएबल्स के बिना रिकर्सन कर सकते हैं? उत्तर है हां।

लोकल वेरिएबल्स के बिना रिकर्सन

फाइबोनैचि श्रृंखला को रिकर्सन का उपयोग करके प्रदर्शित करने के लिए निम्नलिखित उदाहरण देखें। मूल पुनरावृत्ति संबंध है:

fib(0) = 0 fib(1) = 1 else fib(n) = fib(n-1) + fib(n-2) रिकर्सन का उपयोग करके फाइबोनैचि श्रृंखला #!/bin/bash fib( ) { a=$1 if [ $a -lt 2 ]; then echo $a else ((--a)) b=$(fib $a) ((--a)) c=$(fib $a) echo $((b+c)) fi } for i in $(seq 0 15) do out=$(fib $i) echo $out done exit 0

उपरोक्त स्क्रिप्ट में कोई लोकल वेरिएबल्स उपयोग नहीं किए गए हैं। मुझे आशा है कि आप निष्पादन के दौरान स्क्रिप्ट के प्रवाह को समझ सकते हैं।

यहां मान 15 प्रदर्शित होने वाली फाइबोनैचि श्रृंखला में पदों की संख्या को दर्शाता है। क्या आपने उपरोक्त स्क्रिप्ट के निष्पादन के बारे में कुछ खास देखा। इसमें थोड़ा समय लगता है, है ना? स्क्रिप्ट में रिकर्सन C जैसी प्रोग्रामिंग भाषाओं में रिकर्सन की तुलना में धीमी है।

इस लेख के साथ, मैं शेल स्क्रिप्टिंग में फंक्शन भाग को समाप्त करने की योजना बना रहा हूं। Tecmint के साथ अपडेट रहें ताकि ऐरे और बहुत कुछ पर आगामी लेख प्राप्त कर सकें...

  1. लिनक्स शेल स्क्रिप्टिंग: वेरिएबल्स पर गहन नज़र – भाग 9 लिनक्स शेल स्क्रिप्टिंग: वेरिएबल्स पर गहन नज़र – भाग 9

    हम पहले ही लिनक्स शेल स्क्रिप्टिंग पर लेखों की एक श्रृंखला लिख चुके हैं जिसे उस समय बहुत सराहा गया था और यह आज भी उतना ही प्रासंगिक है। शेल स्क्रिप्टिंग पर लेखों के संग्रह का लिंक यहां दिया गया है। लिनक्स शेल स्क्रिप्टिंग सीखें इस लेख में हम वेरिएबल्स, उनके निष्पादन और शेल स्क्रिप्ट में उनके कार्य

  1. Bash शेल फ़ंक्शन्स में मास्टर करें: 6 व्यावहारिक उदाहरण और टिप्स Bash शेल फ़ंक्शन्स में मास्टर करें: 6 व्यावहारिक उदाहरण और टिप्स

    Bash शेल फ़ंक्शन्स कई UNIX / Linux कमांड्स को बाद में निष्पादन के लिए एक ही नाम का उपयोग करके समूहबद्ध करने का एक तरीका है। Bash शेल फ़ंक्शन को नियमित Unix कमांड की तरह निष्पादित किया जा सकता है। शेल फ़ंक्शन्स को किसी नई प्रक्रिया को बनाए बिना वर्तमान शेल संदर्भ में निष्पादित किया जाता है। Bash alia

  1. Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय Bash स्क्रिप्टिंग में मास्टर करें: 5 वास्तविक-विश्व उदाहरणों के साथ एक व्यावहारिक परिचय

    हमारे चल रहे Unix Sed और Unix Awk सीरीज़ के समान, हम Bash स्क्रिप्टिंग पर कई लेख पोस्ट करेंगे, जो व्यावहारिक उदाहरणों के साथ सभी Bash स्क्रिप्टिंग तकनीकों को कवर करेंगे। शेल एक प्रोग्राम है, जो उपयोगकर्ता कमांड्स की व्याख्या करता है। कमांड्स या तो उपयोगकर्ता द्वारा सीधे दर्ज की जाती हैं या शेल स्क्र