ব্যাশ ফাংশনের সম্পূর্ণ নির্দেশিকা: আপনার শেল স্ক্রিপ্টগুলো অপ্টিমাইজ করুন

সর্বশেষ আপডেট: 3 octubre 2026
লেখক: Alexandra
  • ফাংশন আপনাকে কোডের ব্লকগুলিকে একত্রিত করার সুযোগ দেয়, যার ফলে পুনরাবৃত্তি এড়ানো যায় এবং স্ক্রিপ্টের পঠনযোগ্যতা উন্নত হয়।
  • গ্লোবাল এনভায়রনমেন্টের সাথে দ্বন্দ্ব এড়ানোর জন্য `local` কীওয়ার্ড ব্যবহার করে ভেরিয়েবলের স্কোপ নিয়ন্ত্রণ করা অপরিহার্য।
  • ব্যাশে মান ফেরত দেওয়া শুধুমাত্র এক্সিট স্টেটে (0-255) সীমাবদ্ধ, এবং জটিল ডেটা ফেরত দেওয়ার জন্য ইকো বা ভেরিয়েবল ব্যবহার করা প্রয়োজন।
  • সোর্স কমান্ড ব্যবহার করে মডিউলারাইজেশন একাধিক সিস্টেম ফাইলে ফাংশনগুলির পুনঃব্যবহার সহজ করে তোলে।

একটি আধুনিক ডেভেলপমেন্ট পরিবেশে, পেশাদার সিনট্যাক্স হাইলাইটিং সহ একটি ব্যাশ স্ক্রিপ্ট প্রদর্শিত হচ্ছে এমন একটি মনিটরের ক্লোজ-আপ ছবি।

যখন আপনি ব্যাশ স্ক্রিপ্ট লেখা শুরু করেন, তখন প্রথমে সবকিছু সহজ মনে হওয়াটাই স্বাভাবিক, কিন্তু একটা পর্যায়ে এসে কোডটা বেশ জঞ্জালপূর্ণ হয়ে ওঠে। যদি আপনি লক্ষ্য করে থাকেন যে আপনি একই কমান্ডের অংশ বারবার কপি-পেস্ট করছেন, তাহলে ফাংশন ব্যবহার শুরু করার সময় এসেছে। মূলত, একটি ফাংশন হলো অন্য একটি স্ক্রিপ্টের মধ্যে থাকা একটি ছোট স্ক্রিপ্টের মতো , যা আপনাকে একগুচ্ছ নির্দেশাবলীর একটি নাম দেওয়ার সুযোগ দেয়, যাতে আপনি যখন খুশি সেগুলোকে কল করতে পারেন।

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

ব্যাশে কীভাবে ফাংশন ঘোষণা করতে হয়

একটি ফাংশন কার্যকর করার জন্য, ব্যাশ (Bash) বেশ কয়েকটি উপায় প্রদান করে, তাই আপনি আপনার পছন্দ অনুযায়ী যেকোনো একটি ব্যবহার করতে পারেন। সবচেয়ে প্রচলিত এবং পছন্দের উপায় হলো ফাংশনের নামের পরে প্রথম বন্ধনী (parnates) দেওয়া। উদাহরণস্বরূপ: mi_funcion() { comandos; }এছাড়াও একটি আরও সুস্পষ্ট বাক্য গঠন রয়েছে যা সংরক্ষিত শব্দ ব্যবহার করে। ক্রিয়া নামের আগে, যদিও আধুনিক লিপিতে এর ব্যবহার তুলনামূলকভাবে কম দেখা যায়।

যদি আপনার তাড়া থাকে এবং সবকিছু এক লাইনে গুছিয়ে বলতে চান, তবে তা করতে পারেন, কিন্তু ফাঁকা জায়গার ব্যাপারে সতর্ক থাকবেন! একটি ফাঁকা জায়গা রাখা অত্যাবশ্যক। খোলার কী-এর পরে স্পেস এবং সমাপ্তি বিবৃতির আগে, অভ্যন্তরীণ কমান্ডগুলোকে সেমিকোলন দিয়ে আলাদা করার পাশাপাশি। উদাহরণস্বরূপ: nombre() { echo "Hola"; echo "Mundo"; }আপনি এই বিবরণগুলো ভুলে গেলে, ব্যাশ ত্রুটি দেখাবে এবং স্ক্রিপ্টটি চালু হবে না।

একটি গুরুত্বপূর্ণ বিষয় যা উপেক্ষা করা যায় না তা হলো, একটি ফাংশন ডিক্লেয়ার করলেই যে সেটি স্বয়ংক্রিয়ভাবে এক্সিকিউট হবে, তা নয়। কার্লি ব্র্যাকেটের ভেতরের কোডটিকে কার্যকর করতে হলে, আপনাকে স্ক্রিপ্টের বডিতে ফাংশনটিকে তার নাম দিয়ে কল করতে হবে। এছাড়াও, ফাংশনটি ব্যবহার করার চেষ্টা করার আগে সর্বদা এটিকে ডিফাইন করতে মনে রাখবেন ; যদি আপনি ডিক্লেয়ার করার আগেই এটিকে কল করেন, তাহলে শেল বুঝতে পারবে না আপনি কী বলছেন এবং একটি এরর দেখাবে।

ভেরিয়েবলের খেলা: গ্লোবাল ও লোকাল স্কোপ

এখানেই অনেকে বিভ্রান্ত হন। ব্যাশে (Bash) ডিফল্টভাবে, আপনার তৈরি করা যেকোনো ভ্যারিয়েবল ' গ্লোবাল' হয় । এর মানে হলো, আপনি যদি কোনো ফাংশনের ভেতরে একটি ভ্যারিয়েবল নির্ধারণ করেন, তবে সেটি সেই ফাংশনের বাইরেও বিদ্যমান থাকবে এবং তার মান ধরে রাখবে, যা প্রোগ্রামের অন্যান্য অংশকে প্রভাবিত করতে পারে। এটি উপকারী হতে পারে, কিন্তু বড় স্ক্রিপ্টের ক্ষেত্রে এটি প্রায়শই বিপর্যয়ের কারণ হয়ে দাঁড়ায়।

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

ফাংশনে আর্গুমেন্ট প্রেরণ করা

ফাংশনগুলোকে স্ট্যাটিক হতে হবে এমন কোনো কথা নেই; প্রতিবার কল করার সময় ভিন্ন ভিন্ন তথ্য প্রক্রিয়াকরণের জন্য এগুলো ডেটা গ্রহণ করতে পারে। আর্গুমেন্ট পাস করার জন্য, ফাংশনের নামের পরে স্পেস দিয়ে আলাদা করে সেগুলো লিখুন। ফাংশনের ভেতরে, আপনি `/` ব্যবহার করে সেগুলো অ্যাক্সেস করবেন। অবস্থানগত চলক Como $1, $2ইত্যাদি

এটা আলাদা করে বোঝা গুরুত্বপূর্ণ যে এই ভেরিয়েবলগুলো মূল স্ক্রিপ্ট দ্বারা প্রাপ্ত আর্গুমেন্টগুলো থেকে স্বাধীন। অপরপক্ষে $0 সর্বদা বোঝায় স্ক্রিপ্টের নাম, ভেরিয়েবলগুলি থেকে $1 আপ $9 একটি ফাংশনের মধ্যে, এগুলি বিশেষভাবে সেই ফাংশনে প্রেরিত প্যারামিটারগুলিকে বোঝায়। এছাড়াও, আমাদের কাছে কিছু দরকারী সরঞ্জাম রয়েছে যেমন $# কতগুলি যুক্তি পাওয়া গেছে তা খুঁজে বের করতে অথবা $@ প্যারামিটারগুলির সম্পূর্ণ তালিকা দেখতে।

মান ফেরত দেওয়ার দ্বিধা

পাইথন বা জাভার মতো ভাষাগুলোর বিপরীতে, ব্যাশ ফাংশনগুলো প্রচলিত অর্থে কোনো মান ফেরত দেয় না। স্টেটমেন্টটি যা ফেরত দেয় return হয় প্রস্থান অবস্থা০ থেকে ২৫৫-এর মধ্যে একটি পূর্ণসংখ্যা। প্রচলিত নিয়ম অনুযায়ী, ০ নির্দেশ করে যে সবকিছু মসৃণভাবে সম্পন্ন হয়েছে (সফলতা) এবং অন্য যেকোনো সংখ্যা একটি ত্রুটি কোড নির্দেশ করে।

যদি আপনার কোনো গণনার ফলাফল বা কোনো টেক্সট পাওয়ার প্রয়োজন হয়, তবে আপনার কাছে দুটি প্রধান উপায় আছে। প্রথমটি হলো ফলাফলটি সংরক্ষণ করার জন্য একটি গ্লোবাল ভেরিয়েবল ব্যবহার করা, যদিও এটি সবচেয়ে পরিচ্ছন্ন পদ্ধতি নয়। আরও মার্জিত উপায়টি হলো ব্যবহার করা স্ট্যান্ডার্ড আউটপুট কমান্ড ব্যবহার করে echo o printf এবং কমান্ড সাবস্টিটিউশন ব্যবহার করে বাইরে থেকে সেই ফলাফলটি গ্রহণ করুন: resultado=$(mi_funcion)এইভাবে, ফাংশন দ্বারা প্রিন্ট করা মানটি সরাসরি ভেরিয়েবলে সংরক্ষিত হয়।

উন্নত পুনঃব্যবহার এবং পুনরাবৃত্তি

ব্যাশের অন্যতম সেরা একটি সুবিধা হলো ফাংশনগুলোকে আলাদা ফাইলে সাজিয়ে রাখার ক্ষমতা। আপনার যদি এমন কিছু টুল থাকে যা আপনি অনেক স্ক্রিপ্টে ব্যবহার করেন, তবে আপনি সেগুলোকে একটি ফাইলে সংরক্ষণ করতে পারেন (উদাহরণস্বরূপ, utils.shএবং কমান্ড ব্যবহার করে সেগুলোকে অন্য যেকোনো স্ক্রিপ্টে লোড করুন। উৎস (অথবা মূল বিষয়) .এটি আপনার ফাংশনগুলোকে বর্তমান প্রসেসে ব্যবহারযোগ্য কমান্ডে রূপান্তরিত করে, যার ফলে ডেভেলপমেন্টের সময় সাশ্রয় হয়।

যারা আরও দুঃসাহসিক কিছু করতে চান, তাদের জন্য রয়েছে রিকার্সিভ ফাংশন , যেগুলো নিজেদেরকেই কল করে। যেসব সমস্যাকে একই রকম ছোট ছোট উপ-কাজে ভাগ করা যায়, যেমন ফ্যাক্টোরিয়াল গণনা করা, সেগুলো সমাধানের জন্য এই ফাংশনগুলো আদর্শ। এক্ষেত্রে মূল বিষয় হলো সবসময় একটি বেস কেস নির্ধারণ করা ; অন্যথায়, সিস্টেমের রিসোর্স শেষ না হওয়া পর্যন্ত এবং স্ক্রিপ্টটি ক্র্যাশ না করা পর্যন্ত ফাংশনটি নিজেকে অসীমভাবে কল করতে থাকবে।

ফাংশনের ব্যবহারে দক্ষতা অর্জন করলে আপনি রৈখিক এবং ক্লান্তিকর স্ক্রিপ্টগুলোকে মডিউলার টুলে রূপান্তরিত করতে পারেন, যা পড়া ও রক্ষণাবেক্ষণ করা সহজ। ভেরিয়েবলের সঠিক ঘোষণা এবং স্কোপের বুদ্ধিদীপ্ত ব্যবস্থাপনা থেকে শুরু করে রিকারশনের ব্যবহার এবং সোর্সের মাধ্যমে এক্সটার্নাল লাইব্রেরি ইম্পোর্ট করা পর্যন্ত—এই সক্ষমতাগুলো ব্যাশ শেলকে যেকোনো সিস্টেম অ্যাডমিনিস্ট্রেটর বা ডেভেলপারের জন্য একটি অত্যন্ত শক্তিশালী অটোমেশন পরিবেশে পরিণত করে।