আমি কীভাবে শেল স্ক্রিপ্টে স্যুইচগুলি পরিচালনা করব?


17

সেখানে আছেন কিছু বিল্ট ইন সরঞ্জামগুলি আমাদের কাছে চিনতে পারবে -xএবং --xxxxসুইচ হিসেবে এবং আর্গুমেন্ট, বা, পরীক্ষা ড্যাশ জন্য আপনি সমস্ত ইনপুট বৈপরিত্য মধ্য দিয়ে যেতে না, এবং তারপর তারপরে আর্গুমেন্ট পার্স?

উত্তর:


16

ব্যবহার getopts

এটি মোটামুটি পোর্টেবল হিসাবে এটি পসিক্স স্পকে রয়েছে। দুর্ভাগ্যক্রমে এটি দীর্ঘ বিকল্পগুলি সমর্থন করে না।

বাশ-হ্যাকার উইকির এই getopts টিউটোরিয়াল সৌজন্যতা এবং স্ট্যাকওভারফ্লো থেকে এই প্রশ্নটি দেখুন

আপনার যদি কেবল সংক্ষিপ্ত বিকল্পের প্রয়োজন হয় তবে getopts(নীরবীন ত্রুটির প্রতিবেদন ব্যবহার করে) এর জন্য সাধারণ ব্যবহারের ধরণটি হ'ল:

# process arguments "$1", "$2", ... (i.e. "$@")
while getopts "ab:" opt; do
    case $opt in
    a) aflag=true ;; # Handle -a
    b) barg=$OPTARG ;; # Handle -b argument
    \?) ;; # Handle error: unknown option or missing required argument.
    esac
done

3
এটি উল্লেখ করা getoptউচিত যে এটি ব্যবহার করার আগে সর্বদা GNU getopt হিসাবে যাচাই করা উচিত, তবে যাইহোক আপনি getoptsআরও পোর্টেবল (এবং সাধারণত ভাল) এটি ব্যবহার করা উচিত নয় । আপনি যদি না এটা কোনো কারণে কল করতে হবে, যা গনুহ-নির্দিষ্ট ভাবে একে ডাকতে, আর তা নিশ্চিত GETOPT_COMPATIBLEপরিবেশে নয়।
ক্রিস ডাউন

কোলন কী করে while getopts "ab:" opt?
ব্যবহারকারী 394

1
@ ব্যবহারকারী 394 :বিকল্প বিকল্পটি প্রকাশের পরে এটিতে একটি যুক্তি প্রয়োজন। :প্রথম চরিত্র হিসাবে একটি ত্রুটি বার্তা দমন করা মানে।
jw013

22

আমি ধরে নিয়েছি আপনি বাশ বা অনুরূপ ব্যবহার করছেন। একটি উদাহরণ:

all=false
long=false

while getopts ":hal" option; do
  case $option in
    h) echo "usage: $0 [-h] [-a] [-l] file ..."; exit ;;
    a) all=true ;;
    l) long=true ;;
    ?) echo "error: option -$OPTARG is not implemented"; exit ;;
  esac
done

# remove the options from the positional parameters
shift $(( OPTIND - 1 ))

ls_opts=()
$all && ls_opts+=( -a )
$long && ls_opts+=( -l )

# now, do it
ls "${ls_opts[@]}" "$@"

1
+=অ্যারে ব্যবহারের জন্য +1 আপনি কি করতে পারেন জানতেন না। নিস!
জেমস স্নিঞ্জার 21

5

পরামিতিগুলি বিশ্লেষণ করতে আপনাকে একটি চক্র লিখতে হবে। আপনি getoptsকমান্ডটি সহজেই এটি ব্যবহার করতে পারেন।

এটি getoptsম্যানুয়াল পৃষ্ঠা থেকে একটি সাধারণ উদাহরণ :

aflag=
bflag=
while getopts ab: name
do
    case $name in
    a)    aflag=1;;
    b)    bflag=1
          bval="$OPTARG";;
    ?)    printf "Usage: %s: [-a] [-b value] args\n" $0
          exit 2;;
    esac
done
if [ ! -z "$aflag" ]; then
    printf "Option -a specified\n"
fi
if [ ! -z "$bflag" ]; then
    printf 'Option -b "%s" specified\n' "$bval"
fi
shift $(($OPTIND - 1))
printf "Remaining arguments are: %s\n" "$*"

2

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

options () {

    if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
        while (( "$#" )); do  # process ALL arguments
            if [ "$1" = ^-t$ ]; then # -t short for "test"
                # do something here THEN shift the argument
                # shift removes it from $@ and reduces $# by
                # one if you supply no argument
                shift

            # we can also process multiple arguments at once
            elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
                # do something more then remove them ALL from the arg list    
                shift 3
            else
                echo "No matching arguments!"
                echo "Usage: [script options list here]"
            fi
        done
    else
        echo "Usage: [script options list here]"
        exit 0
    fi
}

options "$@" # run options and loop through/process ALL arguments

আমি আপনার বাশ স্ক্রিপ্টটি 400 লাইন / 15 কে কম অক্ষরে সীমাবদ্ধ করার পরামর্শ দিচ্ছি; আমার উল্লিখিত স্ক্রিপ্টটি এই আকারের অতীতে বেড়েছে এবং এতে কাজ করা বেশ কঠিন হয়ে পড়েছে। আমি এটি পার্লটিতে পুনরায় লেখা শুরু করেছি, যা কাজের জন্য আরও ভাল। আপনি আপনার স্ক্রিপ্টগুলিতে ব্যাশে কাজ করার সময় এটি মনে রাখবেন। ছোট স্ক্রিপ্টস এবং অনিলিনারদের জন্য বাশ দুর্দান্ত, তবে আরও জটিল কিছু এবং আপনি পার্লে এটি লেখার চেয়ে ভাল।

দ্রষ্টব্য, আমি উপরেরটি পরীক্ষা করিনি, সুতরাং এটি সম্ভবত কার্যকর হয় না তবে আপনি এটি থেকে সাধারণ ধারণা পান।


optionsশেষে আপনি যেভাবে কল করবেন তা সঠিক নয়, এটি ফিরে আসবে -bash: syntax error near unexpected token $@। এটি হিসাবে কল করুন options "$@"
ক্রিস ডাউন

হ্যাঁ, আমি পার্ল এবং বাশ মিশ্রিত করেছি। সংশোধন।
লেবেশাদে

তার বদলে কি সেই whileঅবস্থা হওয়া উচিত নয় (($#))?
manatwork

আপনার জন্য কেন দুটি সেট বন্ধনী প্রয়োজন $#? সম্পাদনা: আপনি ঠিক বলেছেন। এটি স্থির করেwhile (( "$#" ))
ল্যাবশেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.