শেল স্ক্রিপ্টে ফাংশন লেখা বোঝার”上রে আমার পূর্বের আর্টিকেলটি আপনাকে একটি বেসিক ধারণা দিয়েছে হবে। এখন ফাংশনাল ফিচার যেমন লোকাল ভেরিয়েবল এবং রিকার্সনের ব্যবহারে গভীরে যেতে হবে।
লোকাল ভেরিয়েবল
একটি ভেরিয়েবল কীভাবে লোকাল হয়? এটি সেই নির্দিষ্ট ব্লকে নির্ভর করে যেখানে ভেরিয়েবলটি ঘোষণা করা হয়েছে। 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
এটি ঘটে কারণ ফাংশন func এখনো কল হয়নি যখন প্রথম ২টি echo স্টেটমেন্ট এক্সিকিউট হয়েছিল। ফাংশন func কল করার পর একই ২টি echo স্টেটমেন্ট ভিন্ন ফলাফল দেয়। এখন ভেরিয়েবল 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)
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-এর সাথে আপডেটেড থাকুন আপকামিং আর্টিকেলগুলোর জন্য অ্যারে এবং আরও অনেক কিছুর ওপর…