যে কোন প্রোগ্রামিং ল্যাঙ্গুয়েজে ফাংশন গুরুত্বপূর্ণ ভূমিকা পালন করে। অনেক বাস্তব প্রোগ্রামিং ভাষার মতো, ব্যাশের ফাংশন রয়েছে যা সীমিত বাস্তবায়নের সাথে ব্যবহার করা হয়।
ফাংশন কি?
প্রোগ্রামিং-এ, ফাংশনগুলিকে একটি প্রোগ্রামের বিভাগগুলির নাম দেওয়া হয় যা একটি নির্দিষ্ট কাজ সম্পাদন করে। এই অর্থে, একটি ফাংশন হল এক ধরনের পদ্ধতি বা রুটিন। যখন একটি ফাংশন বলা হয় তখন প্রোগ্রামটি কোডের বর্তমান বিভাগটি ছেড়ে দেয় এবং ফাংশনের ভিতরে প্রথম লাইনটি চালানো শুরু করে। যখনই পুনরাবৃত্তিমূলক কোড থাকে বা যখন একটি কাজ পুনরাবৃত্তি হয়, তার পরিবর্তে একটি ফাংশন ব্যবহার করার কথা বিবেচনা করুন৷
উদাহরণ স্বরূপ, একটি নির্দিষ্ট প্রোগ্রামের বিভিন্ন পর্যায়ে আমাদের একটি সংখ্যার ফ্যাক্টরিয়াল খুঁজে বের করতে হবে এমন ক্ষেত্রে বিবেচনা করুন। প্রতিবার পুরো কোডটি (ফ্যাক্টোরিয়াল গণনার জন্য) লেখার পরিবর্তে, আমরা কোডের সেই অংশটি লিখতে পারি যা একটি ব্লকের ভিতরে একবার ফ্যাক্টোরিয়াল গণনা করে এবং একাধিক অনুষ্ঠানে একইটি পুনরায় ব্যবহার করে।
কেন আমরা ফাংশন লিখি?
- এটি আমাদের কোড পুনরায় ব্যবহার করতে সাহায্য করে।
- প্রোগ্রামের পঠনযোগ্যতা উন্নত করুন।
- প্রোগ্রামের ভিতরে ভেরিয়েবলের দক্ষ ব্যবহার।
- আমাদের প্রোগ্রাম অংশে পরীক্ষা করার অনুমতি দেয়।
- প্রোগ্রামটি উপ-পদক্ষেপের একটি গুচ্ছ হিসাবে প্রদর্শন করে।
শেল স্ক্রিপ্টে ফাংশন
শেল স্ক্রিপ্টে ফাংশন লেখার জন্য সাধারণ সিনট্যাক্স নিম্নলিখিত উপায়গুলি অন্তর্ভুক্ত করে৷
function func_name { . . . commands . . . } or func_name ( ) { . . . commands . . . } Opening curly braces can also be used in the second line as well. func_name ( ) { . . . commands . . . }
আপনি সর্বদা এই ফাংশন ব্লকের ভিতরে বৈধ কমান্ড লিখতে স্বাধীন যেমন আমরা সাধারণত শেল স্ক্রিপ্টে করি। এখন এর ভিতরে একটি ছোট ফাংশন সহ একটি সহজ স্ক্রিপ্ট লেখার চেষ্টা করা যাক।
#!/bin/bash call_echo ( ) { echo ‘This is inside function’ } op=$1 if [ $# -ne 1 ]; then echo "Usage: $0 <1/0>" else if [ $1 = 0 ] ; then echo ‘This is outside function’ elif [ $1 = 1 ] ; then call_echo else echo ‘Invalid argument’ fi fi exit 0
ফাংশন সংজ্ঞা অবশ্যই এটিতে প্রথম কলের আগে থাকবে। কল করার আগে 'ফাংশন ঘোষণা করার' মত কিছুই নেই। এবং আমরা সবসময় ফাংশনের ভিতরে ফাংশন নেস্ট করতে পারি।
নোট৷ :- খালি ফাংশন লেখার ফলে সবসময় সিনট্যাক্স ত্রুটি হয়।
যখন একই ফাংশন একাধিকবার সংজ্ঞায়িত করা হয়, চূড়ান্ত সংস্করণ যা আহ্বান করা হয়। একটি উদাহরণ নেওয়া যাক।
#!/bin/bash func_same ( ) { echo ‘First definition’ } func_same ( ) { echo ‘Second definition’ } func_same exit 0
ফাংশনগুলি প্যারামিটার গ্রহণ করে এবং মান ফেরত দেয়
চলুন প্যারামিটার গ্রহণ এবং মান ফেরত ফাংশন বিবেচনা করে আরও গভীরে যাই। একটি ফাংশন থেকে একটি মান ফেরত দিতে আমরা বিল্ট-ইন 'রিটার্ন' শেল ব্যবহার করি। সিনট্যাক্স নিম্নরূপ।
func_name ( ) { . . . commands . . . return $ret_val }ফেরত দিন
একইভাবে আমরা নিচের মতো স্পেস দিয়ে আলাদা করা ফাংশনে আর্গুমেন্ট পাঠাতে পারি।
func_name $arg_1 $arg_2 $arg_3
ফাংশনের ভিতরে আমরা আর্গুমেন্টগুলিকে $1, $2, $3 ইত্যাদি ক্রমে অ্যাক্সেস করতে পারি। আরও স্পষ্টতা যোগ করতে ফাংশন ব্যবহার করে সর্বাধিক দুটি পূর্ণসংখ্যা খুঁজে পেতে নিম্নলিখিত উদাহরণ স্ক্রিপ্টটি দেখুন৷
#!/bin/bash USG_ERR=7 max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then echo $1 else echo $2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 x if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 else err_str fi else err_str fi exit 0
উপরেরটি কিছুটা জটিল মনে হচ্ছে, তবে আমরা যদি লাইনগুলি পড়ি তবে এটি সহজ। প্রথমে নেস্টেড if-else if লাইনগুলি বৈধকরণের উদ্দেশ্যে যেমন, রেগুলার এক্সপ্রেশনের সাহায্যে সংখ্যা এবং আর্গুমেন্টের ধরন পরীক্ষা করতে। এর পরে আমরা দুটি কমান্ড লাইন আর্গুমেন্ট সহ ফাংশনটিকে কল করি এবং ফলাফলটি সেখানেই প্রদর্শন করি। কারণ আমরা একটি ফাংশন থেকে বড় পূর্ণসংখ্যা ফেরত দিতে পারি না। এই সমস্যাটি সমাধান করার আরেকটি উপায় হল ফলাফলটি ফাংশনের ভিতরে সংরক্ষণ করতে গ্লোবাল ভেরিয়েবল ব্যবহার করা। নীচের স্ক্রিপ্টটি এই পদ্ধতিটি ব্যাখ্যা করে৷
#!/bin/bash USG_ERR=7 ret_val= max_two ( ) { if [ "$1" -eq "$2" ] ; then echo 'Equal' exit 0 elif [ "$1" -gt "$2" ] ; then ret_val=$1 else ret_val=$2 fi } err_str ( ) { echo "Usage: $0 <number1> <number2>" exit $USG_ERR } NUM_1=$1 NUM_2=$2 if [ $# -ne 2 ] ; then err_str elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then max_two $NUM_1 $NUM_2 echo $ret_val else err_str fi else err_str fi exit 0
এখন কিছু উত্তেজনাপূর্ণ সমস্যা ব্যবহার করে দেখুন যা পূর্ববর্তী শেল স্ক্রিপ্টিং সিরিজে নিম্নলিখিত ফাংশনগুলি ব্যবহার করে ব্যাখ্যা করা হয়েছিল৷
- বেসিক লিনাক্স শেল স্ক্রিপ্টিং ভাষা টিপস বুঝুন – অংশ I
- শেল প্রোগ্রামিং শেখার জন্য লিনাক্স নতুনদের জন্য 5 শেল স্ক্রিপ্ট – পার্ট II
- লিনাক্স BASH স্ক্রিপ্টিং-এর জগতের মধ্য দিয়ে যাত্রা – তৃতীয় অংশ
- লিনাক্স শেল প্রোগ্রামিং এর গাণিতিক দিক – চতুর্থ অংশ
- শেল স্ক্রিপ্টিং ল্যাঙ্গুয়েজে গাণিতিক অভিব্যক্তি গণনা করা – পার্ট V
আমি পরবর্তী অংশে স্থানীয় ভেরিয়েবল, পুনরাবৃত্তি ইত্যাদি ব্যবহার করার মতো কার্যকরী বৈশিষ্ট্যগুলির আরও অন্তর্দৃষ্টি সহ ফিরে পাব। মন্তব্য সহ আপডেট থাকুন।