আমি কীভাবে সনাক্ত করতে পারি যে কোনও বিকল্পগুলি গোটপটগুলির সাথে পাস করা হয়নি?


19

আমার এই কোডটি আছে -

#getoptDemo.sh
usage()
{
    echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
    case $option in
            (w)
                    name='1';;
            (l)
                    name='2';;
            (h)
                    name='3';;
            (*)
                    usage
                    exit;;
    esac
done
print 'hi'$name

আমি যখন চালিত করি bash getoptDemos.sh(বিকল্প ছাড়াই) এটি hiফাংশনটি কল করার পরিবর্তে প্রিন্ট করে usage। ডাব্লু, এইচ এবং এল বাদে অন্য বিকল্পগুলি দেওয়া হলে এটি ব্যবহারের ডাক দেয়। তখন কোনও বিকল্প নির্দিষ্ট করা না হলে এটি কাজ করতে পারে না।

আমি ব্যবহার চেষ্টা করেছি ?, \?, :স্থানে *কিন্তু আমি অর্জন করতে পারে না আমি কি করতে চেয়েছিলেন। আমি সব মানে docsউপর getoptবলছেন এটি ব্যবহার করতে ?

আমি কি ভুল করছি?


আপনি কোন শেলের নীচে এটি চালাচ্ছেন?
জুলিয়ান

আমি এটির অধীনে /bin/bash
চলেছি

অন্যান্য বিকল্প: wiki.bash-hackers.org/howto/getopts_tutorial
SLM

উত্তর:


15

আপনি যখন কোনও বিকল্প ছাড়াই এই স্ক্রিপ্টটি চালান, তখন getopt মিথ্যা ফিরে আসবে, সুতরাং এটি লুপটি প্রবেশ করবে না। এটি কেবল মুদ্রণের জন্য নেমে যাবে - এই ksh / zsh হয়?

আপনার যদি অবশ্যই একটি বিকল্প থাকতে পারে তবে লুপের পরে নামটি পরীক্ষা করা আপনার পক্ষে সেরা বাজি।

if [ -z "$name" ]
then
   usage
   exit
fi

তবে নিশ্চিত করুন যে $nameকল করার আগে শূন্য ছিল getopts(যেহেতু $nameপরিবেশে শেলটি শুরুর সময় পেলাম)

unset name

( getoptsলুপের আগে )


কোন। তার বাশ সুতরাং আমি কীভাবে অর্জন করতে পারি - no argumentবাশ ব্যবহার করে শর্তটি পরিচালনা করি ।
হুসেন তম্বোলি

আপনি যদি কোনও বাধ্যতামূলক বিকল্প চান তবে আমার মনে হয় না এটি সম্ভব - কারণ সম্ভবত তাদের বিকল্প হিসাবে ডাকা হয় :) আপনি পরীক্ষা করতে পারেন though নামটি নির্ধারণ করার পরেও, লুপের পরে এটি নির্ধারণ করা হয়েছে কিনা তা পরীক্ষা করতে পারেন। যদি [-z "$ নাম"]; তারপরে ব্যবহার; প্রস্থান; ফাই
জুলিয়ান

ধন্যবাদ। উপরের কোডটি সত্যই সহায়তা করেছে। এটি খুব খারাপ getoptsএমন বিধান নেই। এর চেয়ে খারাপটি আপনাকে উজ্জীবিত করতে পারে না।
হুসেন তম্বোলি

আমি যদি অন্য শেল চালাচ্ছিলাম? zsh, sh। বাশ ছাড়া অন্য কোনও শেল কি এই অবস্থার যত্ন নেয়?
হুসেন তম্বোলি

20

getoptsপরিবর্তে বিকল্পগুলি প্রক্রিয়া করে। এটা তার কাজ। যদি ব্যবহারকারী কোনও বিকল্প পাস না করে, তবে প্রথম অনুরোধটির getoptsসময় লুপটি প্রস্থান করে।

যদি বিকল্পগুলির মধ্যে কোনওটি আর্গুমেন্ট না নেয় তবে OPTINDকতগুলি বিকল্প পাস করা হয়েছে তার মান নির্দেশ করে। সাধারণভাবে, OPTINDবিকল্পগুলি বা অপারেশনগুলির বিপরীতে বিকল্পগুলির পক্ষে আর্গুমেন্ট বা যুক্তিগুলির সংখ্যা কী।

while getopts …; do …; done
if [ $OPTIND -eq 1 ]; then echo "No options were passed"; fi
shift $((OPTIND-1))
echo "$# non-option arguments"

যাই হোক না কেন, আপনি কোনও বিকল্প নেই কিনা তা নির্ধারণের চেষ্টা করছেন না, তবে nameসেটটিং বিকল্পগুলির কোনওটিই পাস করা হয়নি কিনা । সুতরাং আনসেট করা হয়েছে কিনা nameতা পরীক্ষা করুন (এবং এটি প্রথমে আনসেট করার জন্য যত্ন নিন)


1
ধন্যবাদ। আপনার জন্য +1 যখন আমি আপনার কোড থেকে সর্বশেষ 3 লাইনগুলিকে নমুনা.শতে রেখেছি এবং bash sample.sh -abc file.txtএটি চালায় - 1 non-option arguments। কতগুলি বিকল্প দেওয়া হয়েছিল তা আমি কীভাবে খুঁজে বের করব। (এখানে 3)
হুসেন তম্বলি

1
আশ্চর্যরূপে কেউ এই সামান্য বাগ সম্পর্কে কোনও মন্তব্য করেনি - কোনও বিকল্প না দেওয়া থাকলে অপটিটিন্ড তার পরে 1 হবে যখন 'গিওপ্টস ...' লুপ হবে। সুতরাং যদি চেকটি শূন্য নয়, তবে 1 দিয়ে সমতা পরীক্ষা করে check
ড্যানিয়েল

4

যদি আপনার স্ক্রিপ্টে অবশ্যই বিকল্পের আর্গুমেন্টগুলি গ্রহণ করা উচিত, এই ব্লকটি শুরুতে (গেটপগুলির আগে) রাখুন।

if [[ ! $@ =~ ^\-.+ ]]
then
  #display_help;
fi

ব্লক চেক করে যে প্যারামিটার স্ট্রিং -প্রতীক দিয়ে শুরু হয় না , যা সূচিত করে যে প্রথম পরামিতি কোনও বিকল্প যুক্তি নয়।


2

আমি এটি একটি পরিবর্তনশীল সঙ্গে পরীক্ষা করতে হবে। যদি কোনও আর্গুমেন্ট না পাওয়া ক্ষেত্রে গোটগুলি কখনই লুপটি পাস করে না, আপনি উদাহরণস্বরূপ এটি ব্যবহার করতে পারেন:

#getoptDemo.sh
usage()
{
    echo "usage: <command> options:<w|l|h>"
}

no_args="true"
while getopts wlh: option
do
    case $option in
            (w)
                    name='1';;
            (l)
                    name='2';;
            (h)
                    name='3';;
            (*)
                    usage
                    exit;;
    esac
    no_args="false"
done

[[ "$no_args" == "true" ]] && { usage; exit 1; }

print 'hi'$name

0

আপনার getoptsব্লকের ঠিক আগে , $1(কমান্ড লাইনে আপনি প্রথম আর্গুমেন্ট / বিকল্পটি পাস করেছেন) খালি স্ট্রিংয়ের সমান কিনা তা পরীক্ষা করে দেখুন । যদি তা হয় তবে ব্যবহার বার্তাটি মুদ্রণ করুন এবং প্রস্থান করুন (বা আপনি যদি নৈরাজ্যবাদবাদী হন তবে কিছু "বিকল্প নেই" ফাংশনটি কার্যকর করুন), অন্যথায় getoptsসাধারণের মতো বিকল্পগুলি পার্স করতে দিন ।

এই বৈশিষ্ট্যটি গিওপ্টসে অন্তর্ভুক্ত না করার কারণ, কারণ আপনি ইতিমধ্যে "যদি-অন্য" এর সাথে ব্যাশে এটি সম্পাদন করতে পারেন। উদাহরণ:

if [[ $1 == "" ]]; then
    Your_Usage_Function;
    exit;
else
   #parse options with getopts code block here;
fi

ধারণা তৈরী কর?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.