"শেল স্ক্রিপ্টে ফাংশন বোঝা এবং লেখা" সম্পর্কে আমার আগের নিবন্ধটি আপনাকে শেল স্ক্রিপ্টের অধীনে ফাংশনগুলি কীভাবে লিখতে হয় সে সম্পর্কে একটি প্রাথমিক ধারণা দিতে পারে। এখন সময় এসেছে স্থানীয় ভেরিয়েবলের ব্যবহার এবং পুনরাবৃত্তির মতো কার্যকরী বৈশিষ্ট্যগুলির গভীরে যাওয়ার৷
স্থানীয় ভেরিয়েবল
কি একটি পরিবর্তনশীল স্থানীয় করে? এটি সেই নির্দিষ্ট ব্লকের উপর নির্ভর করে যেখানে ভেরিয়েবল ঘোষণা করা হয়। একটি পরিবর্তনশীলকে স্থানীয় হিসাবে ঘোষণা করা হয়েছে কোডের সেই ব্লক থেকে অ্যাক্সেসযোগ্য হবে যেখানে এটি প্রদর্শিত হয় অর্থাৎ এর সুযোগ স্থানীয়। এই জিনিসটি ব্যাখ্যা করার জন্য আসুন নীচের একটি উদাহরণ দেখি।
#!/bin/bash func( ) { local i=10 j=20 echo "i from func =$i" echo "j from func =$j" } echo "i বাইরে func =$i" প্রতিধ্বনি " j বাইরে ফাঙ্ক =$j" ফাঙ্ক ইকো "i বাইরে ফাঙ্ক =$i" ইকো "j বাইরে ফাঙ্ক =$j" প্রস্থান 0
উপরোক্ত স্ক্রিপ্ট চালানো হলে আউটপুট হবে।
i বাইরে func =j বাইরে func =i থেকে func =10 j থেকে func =20 i বাইরে func =j বাইরে func =20
এর কারণ হল ফাংশন func প্রথম 2 পর্যন্ত এখনও কল করেনি প্রতিধ্বনি বিবৃতি কার্যকর করা হয়. ফাংশন কল করার পরে func একই 2টি ইকো স্টেটমেন্ট একটি ভিন্ন ফলাফল তৈরি করুন। এখন পরিবর্তনশীল j , যা func-এর ভিতরে ঘোষণা করা হয়েছিল এবং স্থানীয় নয়, পরে অ্যাক্সেস করা যেতে পারে।
এইভাবে j এর মান 20 হয়ে যায় . স্থানীয় পরিবর্তনশীল i সম্পর্কে কি? ? যেহেতু এর সুযোগ ছিল ফাংশন func এর ভিতরে , মান 10 বাইরে থেকে প্রবেশ করা যেত না। উল্লেখ্য যে পরিবর্তনশীল j সাধারণত func এর ভিতরে ঘোষণা করা হয় ডিফল্টরূপে বিশ্বব্যাপী।
এখন আপনি স্থানীয় ভেরিয়েবলের সাথে পরিচিত এবং কীভাবে সেগুলিকে ফাংশন ব্লকের মধ্যে ব্যবহার করতে হয়। আসুন আমরা ফাংশন, রিকারশনের অধীনে সবচেয়ে আকর্ষণীয় বিভাগে চলে যাই।
পুনরাবৃত্তি কি?
একটি ফাংশন কলিং নিজেই সাধারণত recursion পদ্ধতি হিসাবে অভিহিত করা হয়. অথবা এটি একই অ্যালগরিদমের একটি সহজ সংস্করণ ব্যবহার করে একটি অ্যালগরিদম প্রকাশ হিসাবে সংজ্ঞায়িত করা যেতে পারে। একটি সংখ্যার ফ্যাক্টরিয়াল সন্ধানের উদাহরণটি বিবেচনা করুন। আমরা জানি যে n! =1 x 2 x 3 x … x (n-1) x n . এইভাবে আমরা একটি পুনরাবৃত্তি সম্পর্ক লিখতে পারি:
n! =(n-1)! x n
তাই আমাদের জন্য একই ফাংশনকে পুনরাবৃত্তভাবে কল করা এবং আগের ফলাফলের সাথে গুণ করতে প্রতিটি কল থেকে রিটার্ন মান ব্যবহার করা সহজ, যেমন
<পূর্ব>৫! =4! x 54! =3! x 43! =2! x 32! =1! x 21! =0! x 1স্থানীয় ভেরিয়েবল ব্যবহার করে পুনরাবৃত্তি
এখানে আমরা স্থানীয় ভেরিয়েবল এবং পুনরাবৃত্তি ব্যবহার করে একটি সংখ্যার ফ্যাক্টরিয়াল খুঁজে বের করার জন্য একটি স্ক্রিপ্ট লেখার চেষ্টা করি।
#!/bin/bash fact( ) { local num=$1 if [ $num -eq 0 ]; তারপর ret=1 else temp=$((num-1)) fact $temp ret=$((num*$?)) fi return $ret } fact 5 echo "5 এর ফ্যাক্টরিয়াল =$?" প্রস্থান করুন 0
সংখ্যা প্রতিটি n-1 সংরক্ষণ করতে ব্যবহৃত একটি স্থানীয় পরিবর্তনশীল প্রতিটি কলে মান। এখানে বেস কন্ডিশন চেক করে যে সংখ্যাটি শূন্যের সমান বা না (যেহেতু 0! =1 এবং ফ্যাক্টরিয়াল নেতিবাচক সংখ্যার জন্য সংজ্ঞায়িত করা হয় না)। এই বেস কন্ডিশনে পৌঁছালে এটি 1 মান প্রদান করে এর কলারের কাছে। এখন সংখ্যা =1 এবং ret =1 x 1 .
এই মুহূর্তে এটি 1 ফিরে আসে এর কলারের কাছে। এখন সংখ্যা =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)ফিবোনাচি সিরিজ ব্যবহার করে recursion#!/bin/bash fib() { a=$1 যদি [ $a -lt 2]; তারপর $a এ ইকো কর (seq 0 15) do out=$(fib $i) echo $out সম্পন্ন প্রস্থান 0
উপরের স্ক্রিপ্টে কোন স্থানীয় ভেরিয়েবল ব্যবহার করা হয় না। আমি আশা করি আপনি সম্পাদনের সময় স্ক্রিপ্টের প্রবাহ বুঝতে পারবেন।
এখানে মান 15 ফিবোনাচি সিরিজের পদের সংখ্যা প্রতিনিধিত্ব করে প্রদর্শিত হবে আপনি কি উপরোক্ত স্ক্রিপ্ট কার্যকর করার বিষয়ে বিশেষ কিছু লক্ষ্য করেছেন। এটা একটু সময় লাগে, তাই না? একটি স্ক্রিপ্টে পুনরাবৃত্তি C এর মতো প্রোগ্রামিং ভাষার পুনরাবৃত্তির চেয়ে ধীর .
এই নিবন্ধটির সাথে, আমি শেল স্ক্রিপ্টিংয়ের ফাংশন অংশটি শেষ করার পরিকল্পনা করছি। Tecmint-এর সাথে আপডেট থাকুন আসন্ন নিবন্ধগুলি অ্যারে-এ থাকতে এবং আরো অনেক কিছু...