Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

शैल स्क्रिप्टिंग के साथ कार्य की जटिलताओं में गहराई - भाग VII

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

शैल स्क्रिप्टिंग के साथ कार्य की जटिलताओं में गहराई - भाग VII

स्थानीय चर

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

#!/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 . से अपडेट रहें आगामी लेखों को सरणी . पर रखने के लिए और भी बहुत कुछ…


  1. शेल स्क्रिप्टिंग भाषा में लिनक्स "चर" की एक अंतर्दृष्टि - भाग 9

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

  1. बैश शैल फंक्शन ट्यूटोरियल 6 व्यावहारिक उदाहरणों के साथ

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

  1. बैश स्क्रिप्टिंग परिचय ट्यूटोरियल 5 व्यावहारिक उदाहरणों के साथ

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