0

フラグの順序に関係なく、特定のフラグへの複数の引数を処理できるようにしたいと考えています。これは受け入れられると思いますか?改善点はありますか?

そう:

$ ./script -c opt1 opt2 opt3 -b foo

opt1 opt2 opt3
foo

コード:

echo_args () {
    echo "$@"
}


while (( $# > 0 )); do
    case "$1" in
        -b)
            echo $2
        ;;

        -c|--create)
            c_args=()

            # start looping from this flag
            for arg in ${@:2}; do
                [ "${arg:0:1}" == "-" ] && break
                c_args+=("$arg")
            done

            echo_args "${c_args[@]}"
        ;;

        *)
            echo "huh?"
        ;;
    esac

    shift 1
done
4

2 に答える 2

2

getopts ユーティリティは、パラメーターのリストからオプションとオプション引数を取得します。

$ cat script.sh

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

ガイドライン 8 に注意してください。単一のオプションの後に複数のオプション引数が指定されている場合は、それらを単一の引数として提示する必要があります。引数内のコンマまたは引数内の <blank> を使用してそれらを区切ります。

$ ./script.sh -c "opt1 opt2 opt3" -b foo

Option -b "foo" specified
Option -c "opt1 opt2 opt3" specified
Remaining arguments are:

標準のリンクは次のとおりです。

于 2016-03-06T22:16:27.207 に答える
-1

コメントで、これらのいずれも使用したくないことに気付きました。できることは、すべての引数を文字列として設定し、ループを使用してそれらを並べ替え、切り替えたものとして設定したいものを引き出し、if ステートメントを使用して並べ替えることです。少し野蛮ですが、実行できます。

#!/bin/bash

#set all of the arguments as a variable
ARGUMENTS=$@

# Look at each argument and determine what to do with it.
for i in $ARGUMENTS; do
    # If the previous loop was -b then grab the value of this argument
    if [[ "$bgrab" == "1" ]]; then
        #adds the value of -b to the b string
        bval="$bval $i"
        bgrab="0"
    else
        # If this argument is -b, prepare to grab the next argument and assign it
        if [[ "$i" == "-b" ]]; then
            bgrab="1"
        else
            #Collect the remaining arguments into one list per your example
              RemainingArgs="$RemainingArgs $i"
        fi
    fi
done

echo "Arguments: $RemainingArgs"
echo "B Value: $bval"

いくつかのスクリプトにはかなりの量の引数を入力でき、スクリプトは何をすべきかを理解するためにそれぞれを調べる必要があるため、多くのスクリプトで似たようなものを使用しています。それらは順不同であるか、まったく存在しない可能性があり、コードは引き続き機能する必要があります。

于 2016-03-07T14:48:53.413 に答える