এই টিউটোরিয়ালে ব্যাখ্যা করা হয়েছে আপনার ব্যাশ স্ক্রিপ্টে কমান্ড-লাইন আর্গুমেন্ট কিভাবে পাস করবেন। শুরুতে হেল্প করার জন্য অনেক উদাহরণ অন্তর্ভুক্ত।
Bash/Shell স্ক্রিপ্ট আপনার লিনাক্স ওয়ার্কফ্লো অটোমেট করে এবং ওয়ার্কডে স্পিড আপ করে যাতে আপনি অফিসে আগে যেতে পারেন (সার্ভার রুমে ৫টা পর্যন্ত লুকিয়ে থাকতে পারেন)।
স্ক্রিপ্ট রি-ইউজেবল করলে সেগুলো আরও উপযোগী হয় - আপনার একই টাস্ক বিভিন্ন ইনফো সেট বা বিভিন্ন দিনের জন্য আলাদা স্ক্রিপ্ট লিখতে হবে না - আপনি একই স্ক্রিপ্ট রি-ইউজ করতে পারেন এবং ভিন্ন প্যারামিটার দিতে পারেন - কমান্ড লাইন থেকে স্ক্রিপ্টে দেওয়া ইনস্ট্রাকশন। এটিকে কখনও কমান্ড লাইন আর্গুমেন্ট-ও বলা হয়।
উদাহরণস্বরূপ, আপনার একটি স্ক্রিপ্ট আছে যা কিছু টেক্সট ফাইলে আউটপুট করে। ফাইলনেম চেঞ্জ করতে চাইলে স্ক্রিপ্ট এডিট করতে হতো। একাধিক ফাইলে আউটপুট করতে চাইলে স্ক্রিপ্টের একাধিক কপি রাখতে হতো। প্যারামিটার ব্যবহার করলে, আপনি একটি সিঙ্গেল স্ক্রিপ্ট দিয়ে যেকোনো সংখ্যক ফাইলে, যেকোনো নামে আউটপুট করতে পারেন, কমান্ড লাইন থেকে প্যারামিটার হিসেবে পাস করে।
এই প্যারামিটার - অপশন এবং তাদের ভ্যালু - পাস করার כמה ভিন্ন পদ্ধতি আছে, আপনি কী অর্জন করতে চাচ্ছেন সেটা ডিপেন্ড করে। কয়েকটি মেথড উদাহরণসহ নিচে:
getopts / ফ্ল্যাগস মেথড কমান্ড লাইন ইনপুট পড়ার
- getopts হলো একটি শেল কমান্ড যা কমান্ড লাইন ইনপুট থেকে অপশন (বা ফ্ল্যাগস) রিট্রিভ করে এবং তাদের ভ্যালু (বা আর্গুমেন্ট) স্ক্রিপ্টে ব্যবহার করার জন্য উপলব্ধ করে
- অপশনগুলো একটি সিঙ্গেল লেটার যেটি - (ড্যাশ) দিয়ে প্রসিডেড, তারপর পাস করার ভ্যালু, যেমন -v value
- যখন অর্ডার ম্যাটার করে না সেটায় সেরা ব্যবহার
- এখানে লিস্ট করা সব মেথডের মধ্যে সম্ভবত সেরা
getopts ব্যাশ স্ক্রিপ্ট উদাহরণ
এই উদাহরণ স্ক্রিপ্ট ফাস্ট ফুড অর্ডারের জন্য তিনটি অপশন নেয়:
- -o order-এর জন্য
- -s size-এর জন্য
- -d drink-এর জন্য
fastFoodOrder.sh
#!/bin/bash # o, s, d অপশনগুলো পার্স করার জন্য while লুপ ব্যবহার while getopts o:s:d: flag do # প্রতিটি অপশন (যেটি $flag ভেরিয়েবলে অ্যাসাইন হয়েছে) এর মানে ম্যাচ করুন case স্টেটমেন্ট ব্লক দিয়ে # OPTARG হবে getopts থেকে পাওয়া ভ্যালু কোরেসপন্ডিং অপশনের জন্য এবং ফ্ল্যাগ অনুযায়ী ভেরিয়েবলে অ্যাসাইন হবে case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; esac done # অপশনগুলোর মাধ্যমে পাস করা ভ্যালুগুলো এখন তাদের কোরেসপন্ডিং ভেরিয়েবলে উপলব্ধ echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";; ব্যাশ স্ক্রিপ্টের শুরুতে #!/bin/bash লাইন সম্পর্কে আরো জানতে এখানে ক্লিক করুন।
এটি চালাতে, নিচের কমান্ড দিন:
bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large
যে রেজাল্ট দেবে স্ক্রিপ্ট আউটপুট হিসেবে:
Order: Fish Burger Meal Size: Large Drink: Cola
উপরের আউটপুটে দেখতে পাচ্ছেন - অপশনগুলো কোন অর্ডারে দেওয়া হয়েছে সেটা ম্যাটার করলো না।
স্ক্রিপ্ট এক্সিকিউট করার সময় ./ কেন ব্যবহার করা হয়?
একই অপশনে একাধিক ভ্যালু পাস করা
একই অপশন একাধিকবার পাস করা যাবে একাধিক ভ্যালুর জন্য - সেগুলো স্ক্রিপ্টে অ্যারে হিসেবে উপলব্ধ থাকবে।
এটি একই অপশনে একাধিক ভ্যালু পাস করার সেরা পদ্ধতি কারণ এটি যেকোনো ক্যারেক্টার ভ্যালুতে ব্যবহার করার অনুমতি দেয় - কোটে পাস করা বা ডিলিমিটার ব্যবহার করা সেটাকে লিমিট করে।
fastFoodOrderExtras.sh
#!/bin/bash # o, s, d, e অপশনগুলো পার্স করার জন্য while লুপ ব্যবহার while getopts o:s:d:e: flag do # প্রতিটি অপশন (যেটি $flag ভেরিয়েবলে অ্যাসাইন হয়েছে) এর মানে ম্যাচ করুন case স্টেটমেন্ট ব্লক দিয়ে # OPTARG হবে getopts থেকে পাওয়া ভ্যালু কোরেসপন্ডিং অপশনের জন্য এবং ফ্ল্যাগ অনুযায়ী ভেরিয়েবলে অ্যাসাইন হবে case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; e) extras+=${OPTARG};;# একাধিক extras ভ্যালু ধারণ করার জন্য অ্যারে ভেরিয়েবল তৈরি বা অ্যাপেন্ড করুন esac done # অপশনগুলো দিয়ে পাস করা ভ্যালুগুলো এখন তাদের কোরেসপন্ডিং ভেরিয়েবলে উপলব্ধ echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";; echo "The list of extras is '${extras[@]}'" # একাধিক extras ভ্যালু লুপ করুন for val in "${extras[@]}";; do echo $val done উপরের স্ক্রিপ্ট একাধিক -e অপশন অ্যাকসেপ্ট করে এক্সট্রা যোগ করার জন্য, নিচের মতো:
bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large -e Sauce -e Salt -e Pepper
স্ক্রিপ্ট আউটপুট করবে:
Order: Fish Burger Meal Size: Large Drink: Cola The list of extras is 'SauceSaltPepper' SauceSaltPepper
স্ক্রিপ্টে পজিশনাল প্যারামিটার ব্যবহার
- যখন একটি পরিচিত সংখ্যক আর্গুমেন্ট/প্যারামিটার একটি নির্দিষ্ট অর্ডারে থাকবে
- সিম্পলার স্ক্রিপ্টের জন্য সেরা ব্যবহার
উদাহরণ
fastFoodOrder.sh
#!/bin/bash echo "Order: $1";; echo "Size: $2";; echo "Drink: $3";;
এটি চালাতে, নিচের কমান্ড দিন:
bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola
যে রেজাল্ট দেবে:
Order: Fish Burger Meal Size: Large Drink: Cola
নোট করুন যদি অপশনগুলো অর্ডার বাইরে দেওয়া হয়, সব ভ্যালু মিক্সড আপ হয়ে যাবে। এই মেথডে পজিশন ম্যাটার করে!
bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large
ভ্যালুগুলো ভুল অ্যাসাইন করবে:
Order: Fish Burger Meal Size: Cola Drink: Large
লুপ ব্যবহার করে কমান্ড লাইন প্যারামিটার পড়া
- যখন অপশন/আর্গুমেন্টের সংখ্যা আগে থেকে জানা নয় সেটায় সেরা ব্যবহার
- উদাহরণস্বরূপ, আপনি একটি রেসিপির জন্য ইнг্রিডিয়েন্ট লিস্ট সাপ্লাই করতে পারেন
- বিল্ট-ইন ভেরিয়েবল $@ ব্যবহার করে, যেটি ইউজার দ্বারা সাপ্লাই করা সকল ইনপুট অপশনের অ্যারে ধারণ করে
উদাহরণ
recipe.sh
#!/bin/bash i=1; # এই ভ্যালু ইটারেটর ভ্যালু - কমপ্লিট হওয়া লুপের কারেন্ট নম্বর for ingredient in "$@" # $@-এ লুপ করুন যা সকল পাসড ইনপুট প্যারামিটার-এর অ্যারে do echo "Ingredient number $i is $ingredient";;# $ingredient প্রিন্ট করুন যা স্ক্রিপ্ট কল করার সময় পাস করা হয়েছিল i=$((i + 1));; # ইটেরেটর ভ্যালু ইনক্রিমেন্ট করুন যাতে জানা যায় কতবার লুপ হয়েছে done
রান করুন:
sh ./recipe.sh bread lettuce cheese hamburger
যে আউটপুট করবে:
Ingredient number 1 is bread Ingredient number 2 is lettuce Ingredient number 3 is cheese Ingredient number 4 is hamburger