"शैल स्क्रिप्ट में कार्यों को समझना और लिखना" पर मेरे पिछले लेख ने आपको शेल स्क्रिप्ट के तहत कार्यों को लिखने के बारे में एक बुनियादी विचार दिया होगा। अब समय आ गया है कि स्थानीय चरों के उपयोग और पुनरावर्तन जैसी कार्यात्मक सुविधाओं में गहराई से प्रवेश किया जाए।
स्थानीय चर
क्या एक चर स्थानीय बनाता है? यह उस विशेष ब्लॉक पर निर्भर करता है जहां चर घोषित किया जाता है। स्थानीय . के रूप में घोषित एक चर कोड के उस ब्लॉक से पहुंच योग्य होगा जहां यह दिखाई देता है यानी इसका दायरा स्थानीय है। इस बात को समझाने के लिए आइए नीचे एक उदाहरण देखें।
#!/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
ऐसा इसलिए है क्योंकि फ़ंक्शन func पहले 2 . के दौरान अभी तक कॉल नहीं किया है इको स्टेटमेंट निष्पादित किए गए थे। फ़ंक्शन को कॉल करने के बाद func वही 2 इको स्टेटमेंट एक अलग परिणाम उत्पन्न करें। अब चर j , जिसे func . के अंदर घोषित किया गया था और स्थानीय नहीं, बाद में पहुँचा जा सकता है।
इस प्रकार j . के लिए मान हो जाता है 20 . स्थानीय चर i . के बारे में क्या ? चूँकि इसका कार्यक्षेत्र func . फंक्शन के अंदर था , मान 10 बाहर से प्रवेश नहीं किया जा सकता था। ध्यान दें कि चर j आम तौर पर func . के अंदर घोषित किया जाता है डिफ़ॉल्ट रूप से वैश्विक है।
अब आप स्थानीय चरों और फंक्शन ब्लॉक्स के अंदर उनका उपयोग करने के तरीके से परिचित हैं। आइए फंक्शन्स, रिकर्सन के अंतर्गत सबसे दिलचस्प सेक्शन पर चलते हैं।
पुनरावृत्ति क्या है?
स्वयं को कॉल करने वाले फ़ंक्शन को आम तौर पर रिकर्सन प्रक्रिया कहा जाता है। या इसे उसी एल्गोरिथ्म के सरल संस्करण का उपयोग करके एक एल्गोरिथ्म को व्यक्त करने के रूप में परिभाषित किया जा सकता है। किसी संख्या का भाज्य ज्ञात करने के उदाहरण पर विचार कीजिए। हम जानते हैं कि 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 संख्या एक स्थानीय चर है जिसका उपयोग प्रत्येक n-1 . को संग्रहीत करने के लिए किया जाता है प्रत्येक कॉल पर मूल्य। यहां आधार शर्त यह जांचती है कि संख्या शून्य के बराबर है या नहीं (क्योंकि 0! =1 और ऋणात्मक संख्याओं के लिए भाज्य परिभाषित नहीं है)। इस आधार शर्त पर पहुंचने पर यह 1 . मान लौटाता है इसके कॉलर को। अब संख्या =1 और रिट =1 x 1 ।
इस समय यह 1 . लौटाता है इसके कॉलर को। अब संख्या =2 और रिट =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)
Fibonacci series using recursion
#!/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 . से अपडेट रहें आगामी लेखों को सरणी . पर रखने के लिए और भी बहुत कुछ…