আপনি যখন আপনার কোডটির বিচ্ছিন্নতা কমান্ড লাইনটি লিখবেন তখন আপনি নির্দিষ্ট করবেন যে কোন বিকল্পগুলি আর্গুমেন্ট গ্রহণ করে এবং কোনটি গ্রহণ করে না। উদাহরণস্বরূপ, শেল স্ক্রিপ্টে কোনও -hবিকল্প গ্রহণ করা (উদাহরণস্বরূপ সহায়তার জন্য) এবং একটি -aবিকল্প যা আর্গুমেন্ট গ্রহণ করা উচিত, আপনি তা করেন
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
a:hবিট বলে "আমি দুটি বিকল্প বিশ্লেষণ করতে আশা করছি, -aএবং -h, এবং -aএকটি আর্গুমেন্ট গ্রহণ করা উচিত" (এটা হচ্ছে :পরে aযে পার্সার যে বলে-a একটি আর্গুমেন্ট গ্রহণ করা)।
অতএব, কোনও বিকল্প যেখানে শেষ হয়, কোথায় এর মান শুরু হয় এবং যেখানে এর পরে আর একটি শুরু হয় সেখানে কোনও অস্পষ্টতা থাকে না।
এটি চালানো:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
এজন্য আপনার বেশিরভাগ সময় আপনার নিজের কমান্ড লাইন পার্সার বিকল্পগুলি পার্স করতে লিখবেন না।
এই উদাহরণে একটি মাত্র মামলা রয়েছে যা জটিল। পার্সিংটি সাধারণত প্রথম অ-বিকল্পে থামে, সুতরাং আপনার কাছে যখন কমান্ড লাইনে স্টাফ থাকে যা বিকল্পগুলির মতো দেখায় :
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
নিম্নলিখিত সমাধান করে যে:
$ bash test.sh -a hello -- -world
h: 0
a: hello
--কমাণ্ড লাইন অপশন সম্বন্ধে শেষ সংকেত, এবং-world বিট যাই হোক না কেন এটা দিয়ে (এটা অবস্থানগত ভেরিয়েবল এক থাকবে) চায় না প্রোগ্রামের জন্য ছেড়ে দেওয়া হয়।
এটি হ'ল উপায় দ্বারা, আপনি কীভাবে কোনও ফাইলটির অপসারণের সাথে তার ফাইলটির নাম শুরু করার সাথে ড্যাশ রয়েছে rm।
সম্পাদনা :
সি কলে লিখিত ইউটিলিটিস getopt()(ঘোষিত unistd.h) যা প্রায় একইভাবে কাজ করে। আসলে, আমরা সবাই জানি, সি লাইব্রেরি ফাংশনে একটি কল ব্যবহার করে bashফাংশনটি getoptsপ্রয়োগ করা যেতে পারেgetopt() । পার্ল, পাইথন এবং অন্যান্য ভাষায় একই কমান্ড লাইনের লাইব্রেরি পার্সিং রয়েছে এবং সম্ভবত তারা একইভাবে তাদের পার্সিং সম্পাদন করে।
এর মতো getoptএবং getoptলাইব্রেরির কয়েকটি রুটিন "দীর্ঘ" বিকল্পগুলিও পরিচালনা করে। এগুলি সাধারণত ডাবল-ড্যাশ ( --) এর আগে হয় এবং দীর্ঘ বিকল্পগুলি আর্গুমেন্টগুলি নিয়ে প্রায়শই সমান চিহ্নের পরে এটি করে, উদাহরণস্বরূপ ইউটিলিটির --block-size=SIZE[কিছু বাস্তবায়নের] বিকল্প du(যা এটির জন্যও অনুমতি দেয়)-B SIZE একই জিনিসটি নির্দিষ্ট করার )।
ম্যানুয়ালগুলি প্রায়শই সংক্ষিপ্ত বিকল্পগুলির মধ্যে একটি স্থান দেখানোর জন্য এবং তাদের যুক্তিগুলি সম্ভবত পাঠযোগ্যতার জন্য রচনা করা হয়।
সম্পাদনা : সত্যিই যেমন পুরাতন সরঞ্জাম, ddএবং tarইউটিলিটিগুলি, তাদের সামনে ড্যাশ ছাড়া বিকল্প ব্যবহার করতে পারেন। এটি নিখুঁত reasonsতিহাসিক কারণে এবং সফ্টওয়্যারটির সাথে সামঞ্জস্যতা বজায় রাখার জন্য যা তাদের ঠিক সেই পথে কাজ করতে নির্ভর করে। tarউপযোগ আরো সাম্প্রতিক সময়ে ড্যাশ সঙ্গে অপশন নেওয়ার ক্ষমতা অর্জন করেছে। BSD ম্যানুয়ালটি tar"বান্ডেলযুক্ত পতাকা" জন্য পুরানো শৈলীর বিকল্পগুলিকে কল করে।