টার্মিনাল কমান্ডগুলো সাধারণত অপশন বা সুইচ থাকে, যেগুলো আপনি ব্যবহার করতে পারেন কমান্ডটি কীভাবে কাজ করবে সেটি মডিফাই করতে। অপশনগুলো POSIX স্পেসিফিকেশনে কমান্ড-লাইন ইন্টারফেসের জন্য অন্তর্ভুক্ত। এটি পুরনো UNIX অ্যাপ্লিকেশনlarla স্থাপিত একটি সম্মানিত কনভেনশন, তাই আপনার নিজস্ব কমান্ড তৈরি করার সময় Bash স্ক্রিপ্টে সেগুলো কীভাবে অন্তর্ভুক্ত করতে হয় সেটি জানা ভালো।
বেশির Sprachen-এ মত, Bash-এ অপশন পার্স করার কয়েকটি পদ্ধতি আছে। আজও আমার পছন্দের মেথডটি সেটি যা আমি প্যাট্রিক ভোল্কার্ডিং-এর স্ল্যাকওয়ার বিল্ড স্ক্রিপ্ট থেকে শিখেছিলাম, যেটি আমার শেল স্ক্রিপ্টিং-এ পরিচয় দিয়েছিল যখন আমি প্রথম লিনাক্স ডিসকভার করেছিলাম এবং OS-এর সাথে আসা প্লেইন টেক্সট ফাইলগুলোর মধ্যে সাহস করেছি।
Bash-এ অপশন পার্সিং
Bash-এ অপশন পার্স করার কৌশল হলো আপনার শেল স্ক্রিপ্টে পাস করা সকল আর্গুমেন্টের মধ্য দিয়ে সাইকেল করা, নির্ধারণ করা সেগুলো অপশন কিনা, এবং তারপর পরবর্তী আর্গুমেন্টে শিফ্ট করা। এই প্রসেসটি রিপিট করা যতক্ষণ না অপশন থাকে।
একটি সিম্পল বুলিয়ান অপশন (কभी কখনও সুইচ বা ফ্ল্যাগ বলা হয়) দিয়ে শুরু করুন:
#!/bin/bash while [ True ]; do if [ "$1" = "--alpha" -o "$1" = "-a" ]; then ALPHA=1 shift 1 else break fi done echo $ALPHA
এই কোডে, আমি একটি while লুপ তৈরি করেছি যা ইনফিনিট লুপ হিসেবে কাজ করে যতক্ষণ না আর কোনো আর্গুমেন্ট প্রসেস করার জন্য থাকে। একটি if স্টেটমেন্ট চেষ্টা করে প্রথম পজিশনে ($1) পাওয়া যেকোনো আর্গুমেন্ট --alpha বা -a-এর সাথে ম্যাচ করতে। (এই আর্বিট্রারি অপশন নাম যেস কোনো স্পেশাল সিগনিফিকেন্স নেই। একটি আসল স্ক্রিপ্টে, আপনি --verbose এবং -v ব্যবহার করতে পারেন ভার্বোস আউটপুট ট্রিগার করার জন্য)।
shift কীওয়ার্ড সকল আর্গুমেন্টকে ১ দিয়ে শিফ্ট করে, যেন পজিশন ২-এ ($2) থাকা আর্গুমেন্ট পজিশন ১-এ ($1) চলে আসে। else স্টেটমেন্টটি ট্রিগার হয় যখন আর কোনো আর্গুমেন্ট প্রসেস করার জন্য থাকে না, যা while লুপ ব্রেক করে।
স্ক্রিপ্টের শেষে, $ALPHA-এর ভ্যালু টার্মিনালে প্রিন্ট হয়।
স্ক্রিপ্ট টেস্ট করুন:
$ bash ./test.sh --alpha 1 $ bash ./test.sh $ bash ./test.sh -a 1
অপশনটি সঠিকভাবে ডিটেক্ট হয়েছে।
Bash-এ আর্গুমেন্ট ডিটেক্ট করা
একটা সমস্যা আছে: এক্সট্রা আর্গুমেন্টগুলো উপেক্ষা হয়।
$ bash ./test.sh --alpha foo 1 $
অপশন হিসেবে নয় এমন আর্গুমেন্ট ক্যাচ করতে, আপনি বাকি আর্গুমেন্টগুলো একটি Bash অ্যারেতে ডাম্প করতে পারেন।
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
else
break
fi
done
echo $ALPHA
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
স্ক্রিপ্টের নতুন ভার্সন টেস্ট করুন:
$ bash ./test.sh --alpha foo 1 foo $ bash ./test.sh foo foo $ bash ./test.sh --alpha foo bar 1 foo bar
আর্গুমেন্টসহ অপশন
কিছু অপশন তাদের নিজস্ব আর্গুমেন্ট চায়। উদাহরণস্বরূপ, আপনি ইউজারকে একটি অ্যাট্রিবিউট সেট করার অনুমতি দিতে চাইতে পারেন যেমন কালার বা গ্রাফিকের রেজোলিউশন বা আপনার অ্যাপ্লিকেশনকে একটি কাস্টম কনফিগারেশন ফাইলে পয়েন্ট করতে।
Bash-এ এটি ইমপ্লিমেন্ট করতে, আপনি shift কীওয়ার্ড ব্যবহার করতে পারেন বুলিয়ান সুইচের মত কিন্তু আর্গুমেন্টগুলো ২ দিয়ে শিফ্ট করে ১ দিয়ে নয়।
#!/bin/bash
while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
ALPHA=1
shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
CONFIG=$2
shift 2
else
break
fi
done
echo $ALPHA
echo $CONFIG
ARG=( "${@}" )
for i in ${ARG[@]}; do
echo $i
done
এই কোডে, আমি একটি elif ক্লজ যোগ করেছি প্রতিটি আর্গুমেন্ট --config এবং -c-এর সাথে কমপেয়ার করতে। ম্যাচ হলে, CONFIG নামে একটি ভেরিয়েবলের ভ্যালু সেট হয় যেকোনো দ্বিতীয় আর্গুমেন্টের ভ্যালুতে (এটি মানে --config অপশনটির একটি আর্গুমেন্ট দরকার)। সকল আর্গুমেন্ট ২ দিয়ে শিফ্ট হয়: ১ --config বা -c শিফ্ট করার জন্য, এবং ১ তার আর্গুমেন্ট মুভ করার জন্য। স্বাভাবিকভাবে, লুপটি রিপিট হয় যতক্ষণ না ম্যাচিং আর্গুমেন্ট থাকে।
স্ক্রিপ্টের নতুন ভার্সন একটি টেস্ট:
$ bash ./test.sh --config my.conf foo bar my.conf foo bar $ bash ./test.sh -a --config my.conf baz 1 my.conf baz
অপশন পার্সিং সহজ করা
Bash-এ অপশন পার্স করার অন্যান্য পদ্ধতিও আছে। আপনি বদলে case স্টেটমেন্ট বা getopt কমান্ড ব্যবহার করতে পারেন। আপনি যা বেছে নিন, আপনার ইউজারদের জন্য অপশন যেকোনো অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ ফিচার, এবং Bash এটিকে সহজ করে দেয়।