getoptএবং getoptsবিভিন্ন প্রাণী এবং লোকেরা তাদের কাজগুলি সম্পর্কে কিছুটা ভুল বোঝাবুঝি করে বলে মনে হয়। একটি লুপে কমান্ড-লাইন বিকল্পগুলি প্রক্রিয়া করতে এবং অন্তর্নির্মিত ভেরিয়েবলগুলির পরিবর্তে প্রতিটি পাওয়া বিকল্প এবং মান নির্ধারণের getoptsজন্য একটি অন্তর্নির্মিত bashকমান্ড। getoptতবে, এটি একটি বাহ্যিক ইউটিলিটি প্রোগ্রাম, এবং এটি আসলে আপনার বিকল্পগুলি যেমন b যেমন বাশ getopts, পার্ল Getoptমডিউল বা পাইথন optparse/ argparseমডিউলগুলি করে সেগুলি আপনার জন্য প্রক্রিয়া করে না । যা যা করা হয় getoptতা হ'ল বিকল্পগুলি যা পাস করেছে - অর্থাত্ তাদের আরও একটি স্ট্যান্ডার্ড আকারে রূপান্তরিত করে, যাতে শেল স্ক্রিপ্টের জন্য তাদের প্রক্রিয়াটি সহজ হয়। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন getoptনিম্নলিখিত রূপান্তর করতে পারে:
myscript -ab infile.txt -ooutfile.txt
এটিতে:
myscript -a -b -o outfile.txt infile.txt
আপনাকে প্রকৃত প্রসেসিং নিজেই করতে হবে। আপনি getoptবিকল্পগুলি নির্দিষ্ট করতে পারেন এমন পথে বিভিন্ন বিধিনিষেধ তৈরি করলে আপনাকে মোটেই ব্যবহার করতে হবে না:
- যুক্তি অনুযায়ী কেবল একটি বিকল্প রাখুন;
- সমস্ত বিকল্প কোনও অবস্থানগত পরামিতিগুলির আগে চলে যায় (অর্থাত্ অপশন বিকল্প নয়);
- মান সহ বিকল্পগুলির জন্য (উদাহরণস্বরূপ
-oউপরে) মানটি পৃথক যুক্তি হিসাবে (একটি স্থানের পরে) হিসাবে যেতে হবে।
এর getoptপরিবর্তে কেন ব্যবহার করবেন getopts? মূল কারণ হ'ল কেবল জিএনইউ getoptআপনাকে দীর্ঘ-নামক কমান্ড-লাইন বিকল্পের জন্য সমর্থন দেয়। 1 (গনুহ getopt। লিনাক্স Mac OS X এর সংস্করণ এবং FreeBSD ডিফল্ট মৌলিক এবং-খুব-দরকারী সঙ্গে আসা হয় getopt, কিন্তু গনুহ সংস্করণ ইনস্টল করা যেতে পারে;। নিচে দেখুন)
উদাহরণস্বরূপ, getoptআমার নামক স্ক্রিপ্ট থেকে জিএনইউ ব্যবহারের উদাহরণ এখানে রয়েছে javawrap:
# NOTE: This requires GNU getopt. On Mac OS X and FreeBSD, you have to install this
# separately; see below.
TEMP=`getopt -o vdm: --long verbose,debug,memory:,debugfile:,minheap:,maxheap: \
-n 'javawrap' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
VERBOSE=false
DEBUG=false
MEMORY=
DEBUGFILE=
JAVA_MISC_OPT=
while true; do
case "$1" in
-v | --verbose ) VERBOSE=true; shift ;;
-d | --debug ) DEBUG=true; shift ;;
-m | --memory ) MEMORY="$2"; shift 2 ;;
--debugfile ) DEBUGFILE="$2"; shift 2 ;;
--minheap )
JAVA_MISC_OPT="$JAVA_MISC_OPT -XX:MinHeapFreeRatio=$2"; shift 2 ;;
--maxheap )
JAVA_MISC_OPT="$JAVA_MISC_OPT -XX:MaxHeapFreeRatio=$2"; shift 2 ;;
-- ) shift; break ;;
* ) break ;;
esac
done
এটি আপনাকে পছন্দ --verbose -dm4096 --minh=20 --maxhe 40 --debugfi="/Users/John Johnson/debug.txt"বা অনুরূপ বিকল্পগুলি নির্দিষ্ট করতে দেয় । কল করার প্রভাবটি getoptবিকল্পগুলিকে আকাঙ্ক্ষিত করে তোলা --verbose -d -m 4096 --minheap 20 --maxheap 40 --debugfile "/Users/John Johnson/debug.txt"যাতে আপনি আরও সহজেই এগুলি প্রক্রিয়া করতে পারেন। চারপাশের উদ্ধৃতিগুলি গুরুত্বপূর্ণ "$1"এবং "$2"এটি গুরুত্বপূর্ণ যেহেতু এটি নিশ্চিত করে যে তাদের স্পেসগুলির সাথে যুক্তিগুলি সঠিকভাবে পরিচালনা করা হবে।
যদি আপনি প্রথম 9 টি লাইন মুছে ফেলেন ( eval setলাইনটি দিয়ে সমস্ত কিছু ), কোডটি এখনও কাজ করবে ! যাইহোক, আপনার কোডটি কী ধরণের বিকল্পগুলি গ্রহণ করবে সে সম্পর্কে এটি অনেক বেশি পছন্দসই হবে: বিশেষত, আপনাকে উপরে বর্ণিত "প্রচলিত" ফর্মটিতে সমস্ত বিকল্প নির্দিষ্ট করতে হবে। getoptতবে এর ব্যবহারের সাহায্যে আপনি একক-বর্ণের বিকল্পগুলি গোষ্ঠীভুক্ত করতে পারেন, দীর্ঘ-বিকল্পগুলির সংক্ষিপ্ত অ-দ্ব্যর্থক ফর্মগুলি ব্যবহার করতে পারেন, হয় --file foo.txtবা --file=foo.txtশৈলীটি ব্যবহার করতে পারেন, হয় -m 4096বা -m4096শৈলীটি ব্যবহার করতে পারেন , মিশ্রণ বিকল্পগুলি এবং কোনও ক্রমে নন-বিকল্পগুলি ইত্যাদি getoptঅজানা বা অস্পষ্ট বিকল্পগুলি পাওয়া গেলে একটি ত্রুটি বার্তা আউটপুট দেয়।
দ্রষ্টব্য : দুটি বৈশিষ্ট্য এবং বিভিন্ন কলিং কনভেনশন সহ বেসিক এবং জিএনইউ এর দুটি সম্পূর্ণ ভিন্ন সংস্করণ রয়েছে। 2 বেসিকটি বেশ নষ্ট হয়েছে: এটি কেবল দীর্ঘ বিকল্পগুলি পরিচালনা করে না এটি আর্গুমেন্ট বা খালি যুক্তির অভ্যন্তরে এম্বেড করা স্থানগুলিও পরিচালনা করতে পারে না, যেখানে এটি সঠিকভাবে করে। উপরের কোডটি বেসিকটিতে কাজ করবে না । জিএনইউ লিনাক্সে ডিফল্টরূপে ইনস্টল করা আছে তবে ম্যাক ওএস এক্স এবং ফ্রিবিএসডি-তে এটি পৃথকভাবে ইনস্টল করা দরকার। ম্যাক ওএস এক্সে ম্যাকপোর্টস ( http://www.macport.org ) ইনস্টল করুন এবং তারপরে জিএনইউ ইনস্টল করতে হবে (সাধারণত এর মধ্যে ), এবং আপনার শেলপথটি সামনে রয়েছে কিনা তা নিশ্চিত করুনgetoptgetoptgetoptgetoptgetoptsgetoptgetoptsudo port install getoptgetopt/opt/local/bin/opt/local/bin/usr/bin। ফ্রিবিএসডি-তে ইনস্টল করুন misc/getopt।
আপনার নিজের প্রোগ্রামের জন্য উদাহরণ কোডটি সংশোধন করার জন্য একটি দ্রুত গাইড: প্রথম কয়েকটি লাইনগুলির মধ্যে সমস্তগুলি "বয়লারপ্লেট" যা একই লাইনে থাকবে, কল করা লাইনটি বাদে getopt। আপনার পরে প্রোগ্রামটির নাম পরিবর্তন করা উচিত -n, এর পরে সংক্ষিপ্ত বিকল্পগুলি -oএবং তার পরে দীর্ঘ বিকল্পগুলি নির্দিষ্ট করা উচিত --long। একটি মান নেয় এমন বিকল্পগুলির পরে একটি কোলন রাখুন।
অবশেষে, আপনি যদি ঠিক এর setপরিবর্তে কোডটি দেখতে পান তবে eval setএটি BSD এর জন্য লেখা হয়েছিল getopt। eval setস্টাইলটি ব্যবহার করতে আপনার এটিকে পরিবর্তন করা উচিত , যা উভয় সংস্করণের সাথেই দুর্দান্ত কাজ করে getopt, যখন setসমভূমিটি GNU এর সাথে সঠিকভাবে কাজ করে না getopt।
1 বাস্তবিক, getoptsএ ksh93সমর্থন দীর্ঘ নামে অপশন, কিন্তু এই শেল প্রায়ই হিসাবে হিসাবে ব্যবহার করা হয় না bash। ইন zsh, zparseoptsএই কার্যকারিতা পেতে ব্যবহার করুন ।
2 প্রযুক্তিগতভাবে, "জিএনইউ getopt" একটি ভুল নাম; এই সংস্করণটি আসলে জিএনইউ প্রকল্পের চেয়ে লিনাক্সের জন্য লেখা হয়েছিল। তবে, এটি সমস্ত জিএনইউ কনভেনশন অনুসরণ করে এবং "জিএনইউ getopt" শব্দটি সাধারণত ব্যবহৃত হয় (যেমন ফ্রিবিএসডি তে))