শেল স্ক্রিপ্টিং সহ ফাংশন জটিলতায় গভীরতর - সপ্তম খণ্ড


"শেল স্ক্রিপ্টগুলিতে ফাংশনগুলি বোঝার এবং বোঝার" বিষয়ে আমার পূর্ববর্তী নিবন্ধটি আপনাকে শেল স্ক্রিপ্টগুলির অধীনে কীভাবে ফাংশন লিখতে হবে সে সম্পর্কে আপনাকে একটি প্রাথমিক ধারণা দিতে পারে। এখন স্থানীয় ভেরিয়েবল এবং পুনরাবৃত্তির ব্যবহারের মতো ক্রিয়ামূলক বৈশিষ্ট্যগুলিতে আরও গভীর হওয়ার সময় এসেছে।

কোন পরিবর্তনশীল স্থানীয় করে তোলে? এটি সেই নির্দিষ্ট ব্লকের উপর নির্ভর করে যেখানে ভেরিয়েবল ঘোষিত হয়। স্থানীয় হিসাবে ঘোষিত একটি পরিবর্তনশীল কোডের সেই ব্লক থেকে অ্যাক্সেসযোগ্য হবে যেখানে এটি প্রদর্শিত হবে i অর্থাত্ এর ব্যাপ্তি স্থানীয়। এই জিনিসটি ব্যাখ্যা করার জন্য নীচে একটি উদাহরণ দেওয়া যাক।

#!/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 প্রতিধ্বনি সম্পাদন করার সময় ফানক ফাংশনটি এখনও কল করেনি। ফানক ফাংশনটি কল করার পরে একই 2 প্রতিধ্বনি বিবৃতি আলাদা ফলাফল দেয়। এখন j পরিবর্তনশীল, যা ফানক র ভিতরে ঘোষণা করা হয়েছিল এবং স্থানীয় নয়, পরে অ্যাক্সেস করা যেতে পারে।

এইভাবে জে এর মান 20 হয়ে যায় local স্থানীয় পরিবর্তনশীল আমি কে সম্পর্কে কী বলা যায়? যেহেতু এর পরিধি ফানক ফাংশনের ভিতরে ছিল তাই 10 মানটি বাইরে থেকে অ্যাক্সেস করা যায়নি। নোট করুন যে পরিবর্তনশীল র সাধারণত ফানক র ভিতরে ঘোষণা করা হয় ডিফল্টরূপে গ্লোবাল।

এখন আপনি স্থানীয় ভেরিয়েবলগুলির সাথে এবং সেগুলি কীভাবে ফাংশন ব্লকের মধ্যে ব্যবহার করবেন সে সম্পর্কে আপনার পরিচিত। আসুন ফাংশনগুলির অধীনে সবচেয়ে আকর্ষণীয় বিভাগ, পুনরাবৃত্তির দিকে এগিয়ে চলি।

একটি ফাংশন কলিং নিজেকে সাধারণত পুনরাবৃত্তি পদ্ধতি হিসাবে আখ্যায়িত করা হয়। অথবা এটি একই অ্যালগরিদমের একটি সহজ সংস্করণ ব্যবহার করে একটি অ্যালগরিদম প্রকাশ হিসাবে সংজ্ঞায়িত করা যেতে পারে। একটি সংখ্যার ফ্যাকটোরিয়াল সন্ধানের উদাহরণ বিবেচনা করুন। আমরা জানি যে এন! = 1 x 2 x 3 x… x (n-1) x এন। সুতরাং আমরা একটি পুনরাবৃত্তি সম্পর্ক লিখতে পারেন:

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

নাম হ'ল একটি স্থানীয় ভেরিয়েবল যা প্রতিটি কলটিতে প্রতিটি এন -1 মান সংরক্ষণ করতে ব্যবহৃত হয়। এখানে বেস শর্তটি পরীক্ষা করে যে সংখ্যাটি শূন্যের সমান কিনা বা না (0! = 1 এবং কারণগতটি নেতিবাচক সংখ্যার জন্য সংজ্ঞায়িত হয়নি)। এই বেস শর্তটি পৌঁছে এটি তার কলকারীকে 1 মান প্রদান করে। এখন নাম = 1 এবং রেট = 1 x 1

এই তাত্ক্ষণিক সময়ে এটি তার কলারে 1 ফেরত দেয়। এখন নাম = 2 এবং রেট = 2 x 1 এবং আরও। অবশেষে যখন নাম = 5 ফেরতের মান 24 হবে এবং চূড়ান্ত ফলাফলটি ret = 5 x 24 হবে। চূড়ান্ত ফলাফল 120 প্রাথমিক কলার স্টেটমেন্ট এ নিচে এবং প্রদর্শিত হয়।

উপরের লিপিটিতে একটি সমস্যা আছে। আমি পূর্ববর্তী নিবন্ধে ব্যাখ্যা হিসাবে, ফাংশন বড় পূর্ণসংখ্যার ফিরে আসতে পারে না। সুতরাং উপরের সমস্যার সমাধান খুঁজে পেতে এটির বাম ব্যবহারকারী users

<স্প্যান শৈলী = "রঙ: # 800000;"> প্রশ্ন। আমরা কি স্থানীয় ভেরিয়েবল ব্যবহার না করে পুনরাবৃত্তি করতে পারি? উত্তর হ্যাঁ।

পুনরাবৃত্তি ব্যবহার করে ফিবোনাচি সিরিজ প্রদর্শনের জন্য নিম্নলিখিত উদাহরণটি দেখুন। মূল পুনরাবৃত্তি সম্পর্কটি হ'ল:

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 টি প্রদর্শিত হবে ফিবোনাচি সিরিজের শর্তগুলির সংখ্যা উপস্থাপন করে। উপরের স্ক্রিপ্টটি কার্যকর করার বিষয়ে আপনি কি বিশেষ কিছু লক্ষ্য করেছেন? এটি কিছুক্ষণ সময় নেয়, তাই না? স্ক্রিপ্টে পুনরাবৃত্তি সি এর মতো প্রোগ্রামিং ভাষায় পুনরাবৃত্তির চেয়ে ধীর is

এই নিবন্ধটি দিয়ে, আমি শেল স্ক্রিপ্টিংয়ের অংশগুলি সমাপ্ত করার পরিকল্পনা করছি। অ্যারে এবং আরও অনেক কিছুতে আসন্ন নিবন্ধগুলি পেতে টেকমিন্টের সাথে আপডেট থাকুন