কম্পিউটার

ব্যাশ স্ক্রিপ্টগুলির সাথে অটোমেশনের ভূমিকা

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

  • ব্যাশ শেল স্ক্রিপ্টগুলির সাথে অটোমেশনের সুবিধাগুলি
  • সি বা সি++ এর মত কম্পাইল করা ভাষার চেয়ে সিসাডমিনদের জন্য শেল স্ক্রিপ্ট ব্যবহার করা ভালো পছন্দ কেন
  • নতুন স্ক্রিপ্টগুলির জন্য প্রয়োজনীয়তার একটি সেট তৈরি করা
  • কমান্ড-লাইন ইন্টারফেস (CLI) প্রোগ্রাম থেকে সাধারণ ব্যাশ শেল স্ক্রিপ্ট তৈরি করা
  • স্ক্রিপ্ট চালানোর ইউজার আইডি (UID) ব্যবহার করে নিরাপত্তা বাড়ানো
  • কমান্ড-লাইন প্রোগ্রাম এবং স্ক্রিপ্টের জন্য এক্সিকিউশন ফ্লো কন্ট্রোল প্রদানের জন্য লজিক্যাল তুলনা টুল ব্যবহার করে
  • স্ক্রিপ্ট কার্যকারিতা নিয়ন্ত্রণ করতে কমান্ড-লাইন বিকল্প ব্যবহার করে
  • ব্যাশ ফাংশন তৈরি করা যা একটি স্ক্রিপ্টের মধ্যে এক বা একাধিক অবস্থান থেকে কল করা যেতে পারে
  • কেন এবং কিভাবে ওপেন সোর্স হিসাবে আপনার কোড লাইসেন্স করবেন
  • একটি সাধারণ পরীক্ষার পরিকল্পনা তৈরি এবং বাস্তবায়ন করা

আমি পূর্বে ব্যাশ কমান্ড এবং সিনট্যাক্স এবং কমান্ড লাইনে ব্যাশ প্রোগ্রাম তৈরি সম্পর্কে একটি সিরিজ নিবন্ধ লিখেছিলাম, যা আপনি এই নিবন্ধের শেষে রেফারেন্স বিভাগে খুঁজে পেতে পারেন। তবে চারটি নিবন্ধের এই সিরিজটি স্ক্রিপ্ট তৈরির বিষয়ে (এবং কিছু কৌশল যা আমি দরকারী বলে মনে করি) সম্পর্কে যতটা এটি ব্যাশ কমান্ড এবং সিনট্যাক্স সম্পর্কে।

আমি কেন শেল স্ক্রিপ্ট ব্যবহার করি

সিসাডমিনের জন্য লিনাক্স দর্শনের অধ্যায় 9-এ , আমি লিখি:

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

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

এই প্রথম নিবন্ধটি অনুসন্ধান করে যে কেন শেল স্ক্রিপ্টগুলি সিস্যাডমিনের জন্য একটি গুরুত্বপূর্ণ টুল এবং একটি খুব সাধারণ ব্যাশ স্ক্রিপ্ট তৈরি করার মূল বিষয়গুলি৷

কেন স্বয়ংক্রিয়?

আপনি কি কখনও কমান্ড লাইনে একটি দীর্ঘ এবং জটিল কাজ সম্পাদন করেছেন এবং ভেবেছেন, "খুশি যে এটি সম্পন্ন হয়েছে। এখন আমাকে আর কখনও এটি নিয়ে চিন্তা করতে হবে না!"? আমি - প্রায়ই. আমি শেষ পর্যন্ত বুঝতে পেরেছি যে কম্পিউটারে যা করতে হবে তার প্রায় সবকিছুই (আমার হোক বা যেটি একজন নিয়োগকর্তার বা একজন পরামর্শকারী গ্রাহকের হোক) ভবিষ্যতে আবার করতে হবে।

অবশ্যই, আমি সবসময় মনে করি যে আমি কীভাবে কাজটি করেছি তা মনে রাখব। কিন্তু, প্রায়ই, পরের সময়টি ভবিষ্যতের জন্য যথেষ্ট যে আমি ভুলে যাই যে আমার কখনও আছে এটা করা হয়েছে, একা কিভাবে এটা করতে আমি কাগজের বিটগুলিতে কিছু কাজের জন্য প্রয়োজনীয় পদক্ষেপগুলি লিখতে শুরু করলাম, তারপর ভাবলাম, "আমি কতটা বোকা!" তাই আমি আমার কম্পিউটারের একটি সাধারণ নোটপ্যাড অ্যাপ্লিকেশনে সেই স্ক্রিবলগুলি স্থানান্তরিত করেছি, একদিন অবধি, আমি আবার ভাবলাম, "আমি কতটা বোকা!" যদি আমি আমার কম্পিউটারে এই ডেটা সঞ্চয় করতে যাচ্ছি, আমি একটি শেল স্ক্রিপ্ট তৈরি করতে পারি এবং এটিকে একটি আদর্শ অবস্থানে সংরক্ষণ করতে পারি, যেমন /usr/local/bin অথবা ~/bin , তাই আমি কেবল শেল প্রোগ্রামের নাম টাইপ করতে পারি এবং এটিকে আমি ম্যানুয়ালি করা সমস্ত কাজ করতে দিতে পারি৷

আমার জন্য, অটোমেশনের মানে হল যে আমি কীভাবে কাজটি সম্পাদন করেছি তার বিশদটি মনে রাখতে বা আবার তৈরি করতে হবে না। কীভাবে জিনিসগুলি করতে হয় তা মনে রাখতে সময় লাগে এবং সমস্ত কমান্ড টাইপ করতে সময় লাগে। এটি এমন কাজগুলির জন্য একটি উল্লেখযোগ্য টাইম সিঙ্ক হয়ে উঠতে পারে যেগুলির জন্য প্রচুর সংখ্যক লম্বা কমান্ড টাইপ করতে হয়। শেল স্ক্রিপ্ট তৈরি করে স্বয়ংক্রিয় কাজগুলি রুটিন কাজগুলি সম্পাদন করার জন্য প্রয়োজনীয় টাইপিং হ্রাস করে৷

শেল স্ক্রিপ্ট

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

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

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

শুরু করা

এখানে একটি শেল স্ক্রিপ্টের একটি তুচ্ছ উদাহরণ এবং এটি কীভাবে তৈরি করা যায়। ব্যাশ কমান্ড-লাইন প্রোগ্রামিং-এ আমার আগের সিরিজে, আমি প্রোগ্রামিং-এর প্রতিটি বই থেকে উদাহরণ ব্যবহার করেছি যা আমি কখনও পড়েছি:"হ্যালো ওয়ার্ল্ড।" কমান্ড লাইন থেকে, এটি এই মত দেখায়:

[student@testvm1 ~]$ echo "Hello world"
Hello world

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

আমি একটি পরীক্ষা সিস্টেম বা ভার্চুয়াল মেশিনে (VM) নন-রুট ব্যবহারকারী হিসাবে নিম্নলিখিত উদাহরণগুলি চেষ্টা করার পরামর্শ দিই। যদিও উদাহরণগুলি ক্ষতিকারক নয়, ভুলগুলি ঘটে এবং নিরাপদ থাকা সর্বদা বুদ্ধিমানের কাজ৷

প্রথম কাজ হল আপনার প্রোগ্রাম ধারণ করার জন্য একটি ফাইল তৈরি করা। টাচ ব্যবহার করুন খালি ফাইল তৈরি করতে কমান্ড, হ্যালো , তারপর এটিকে এক্সিকিউটেবল করুন:

[student@testvm1 ~]$ touch hello
[student@testvm1 ~]$ chmod 774 hello

এখন, ফাইলে নিম্নলিখিত লাইন যোগ করতে আপনার প্রিয় সম্পাদক ব্যবহার করুন:

echo "Hello world"

ফাইলটি সংরক্ষণ করুন এবং কমান্ড লাইন থেকে এটি চালান। এই সিরিজের স্ক্রিপ্টগুলি চালানোর জন্য আপনি একটি পৃথক শেল সেশন ব্যবহার করতে পারেন:

[student@testvm1 ~]$ ./hello 
Hello world!

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

শেবাং

যতক্ষণ না আপনি ব্যাশ বা স্ক্রিপ্টে ব্যবহৃত কমান্ডগুলির সাথে সামঞ্জস্যপূর্ণ একটি শেল ব্যবহার করেন ততক্ষণ পর্যন্ত একক বিবৃতিটি ভাল কাজ করে। যদি স্ক্রিপ্টে কোনো শেল নির্দিষ্ট করা না থাকে, তাহলে ডিফল্ট শেলটি স্ক্রিপ্ট কমান্ড চালানোর জন্য ব্যবহার করা হবে।

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

স্ক্রিপ্টের প্রথম লাইন হিসাবে shebang লাইন যোগ করুন, তাই এখন এটি এই মত দেখায়:

#!/usr/bin/bash
echo "Hello world!"

স্ক্রিপ্টটি আবার চালান - আপনি ফলাফলে কোন পার্থক্য দেখতে পাবেন না। আপনার যদি অন্যান্য শেল ইনস্টল করা থাকে (যেমন ksh, csh, tcsh, zsh, ইত্যাদি), একটি শুরু করুন এবং আবার স্ক্রিপ্টটি চালান৷

স্ক্রিপ্ট বনাম সংকলিত প্রোগ্রাম

স্বয়ংক্রিয়ভাবে প্রোগ্রাম লেখার সময়—ভাল, সবকিছু—সিস্যাডমিনদের সর্বদা শেল স্ক্রিপ্ট ব্যবহার করা উচিত। যেহেতু শেল স্ক্রিপ্টগুলি ASCII টেক্সট ফরম্যাটে সংরক্ষিত থাকে, তাই সেগুলি কম্পিউটারের মাধ্যমে মানুষের দ্বারা দেখা এবং পরিবর্তন করা যায়। আপনি একটি শেল প্রোগ্রাম পরীক্ষা করে দেখতে পারেন যে এটি ঠিক কী করে এবং সিনট্যাক্স বা যুক্তিতে কোনো স্পষ্ট ত্রুটি আছে কিনা। এটি খোলা বলতে কী বোঝায় তার একটি শক্তিশালী উদাহরণ৷ .

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

আমি BASIC, C, C++, Pascal, Perl, Tcl/Expect, REXX (এবং এর কিছু বৈচিত্র, অবজেক্ট REXX সহ), অনেক শেল ভাষা (কর্ন, csh এবং Bash সহ), এবং এমনকি কিছু সমাবেশ ব্যবহার করেছি। ভাষা. প্রতিটি কম্পিউটার ল্যাঙ্গুয়েজ যেটি তৈরি করা হয়েছে তার একটি উদ্দেশ্য ছিল:মানুষকে কম্পিউটারকে কী করতে হবে তা বলার অনুমতি দেওয়া। আপনি যখন একটি প্রোগ্রাম লেখেন, আপনি যে ভাষাই বেছে নেন না কেন, আপনি একটি নির্দিষ্ট ক্রমানুসারে নির্দিষ্ট কাজ সম্পাদনের জন্য কম্পিউটারকে নির্দেশনা দিচ্ছেন।

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

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

সিস্যাডমিনরা বেশিরভাগ জিনিসই এক্সিকিউট করার চেয়ে কিভাবে করতে হয় তা বের করতে বেশি সময় নেয়। এইভাবে, আপনি যা কিছু করেন তার জন্য শেল স্ক্রিপ্ট তৈরি করা প্রতিকূল বলে মনে হতে পারে। স্ক্রিপ্ট লিখতে এবং সেগুলিকে এমন টুলে তৈরি করতে কিছু সময় লাগে যা পুনরুত্পাদনযোগ্য ফলাফল দেয় এবং যতবার প্রয়োজন ততবার ব্যবহার করা যেতে পারে। কিভাবে কাজটি করতে হবে তা বের না করে (আবার) স্ক্রিপ্টটি চালানোর সময় প্রতিবার সময় সাশ্রয় হয়।

চূড়ান্ত চিন্তা

এই নিবন্ধটি একটি শেল স্ক্রিপ্ট তৈরি করার সাথে খুব বেশি দূরে যায়নি, তবে এটি একটি খুব ছোট একটি তৈরি করেছে। এটি শেল স্ক্রিপ্ট তৈরি করার কারণগুলিও অন্বেষণ করেছে এবং কেন সেগুলি সিস্টেম প্রশাসকের জন্য সবচেয়ে কার্যকর বিকল্প (সংকলিত প্রোগ্রামগুলির পরিবর্তে)।

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

সম্পদ 

  • ব্যাশের সাথে কীভাবে প্রোগ্রাম করবেন:সিনট্যাক্স এবং টুলস
  • ব্যাশের সাথে কীভাবে প্রোগ্রাম করবেন:লজিক্যাল অপারেটর এবং শেল সম্প্রসারণ
  • ব্যাশের সাথে কীভাবে প্রোগ্রাম করবেন:লুপস

প্রবন্ধগুলির এই সিরিজটি আংশিকভাবে ডেভিড বোথের তিন-অংশের লিনাক্স স্ব-অধ্যয়ন কোর্সের ভলিউম 2, অধ্যায় 10-এর উপর ভিত্তি করে তৈরি করা হয়েছে, লিনাক্স ব্যবহার এবং পরিচালনা করা—জিরো থেকে সিসঅ্যাডমিন।


  1. নতুনদের জন্য শেল স্ক্রিপ্টিং – কিভাবে লিনাক্সে ব্যাশ স্ক্রিপ্ট লিখতে হয়

  2. rbash - একটি সীমাবদ্ধ ব্যাশ শেল ব্যবহারিক উদাহরণ সহ ব্যাখ্যা করা হয়েছে

  3. 6টি ব্যবহারিক উদাহরণ সহ ব্যাশ শেল ফাংশন টিউটোরিয়াল

  4. 5টি ব্যবহারিক উদাহরণ সহ ব্যাশ স্ক্রিপ্টিং ভূমিকা টিউটোরিয়াল