50

getopts を使用して複数のオプションを一緒に処理することは可能ですか? たとえば、myscript -iR または myscript -irv です。

また、条件スクリプトに基づいて必須オプションが必要になる状況があります。たとえば、スクリプトの引数がディレクトリの場合、-R または -r オプションを他のオプション (myscript -iR mydir または myscript -ir mydir または myscript -i -r mydir または myscript -i -R) と共に指定する必要があります。 mydir)、ファイルのみの場合は -i で十分です (myscript -i myfile)。

検索してみましたが、答えがありませんでした。

4

1 に答える 1

122

提供するオプションを連結して、getoptsそれらを分離することができます。caseステートメントでは、各オプションを個別に処理します。

getoptsオプションが表示されたときにフラグを設定し、ループの完了後に必須の「オプション」(!) が存在することを確認できます。

次に例を示します。

#!/bin/bash
rflag=false
small_r=false
big_r=false

usage () { echo "How to use"; }

options=':ij:rRvh'
while getopts $options option
do
    case "$option" in
        i  ) i_func;;
        j  ) j_arg=$OPTARG;;
        r  ) rflag=true; small_r=true;;
        R  ) rflag=true; big_r=true;;
        v  ) v_func; other_func;;
        h  ) usage; exit;;
        \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
        :  ) echo "Missing option argument for -$OPTARG" >&2; exit 1;;
        *  ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
    esac
done

if ((OPTIND == 1))
then
    echo "No options specified"
fi

shift $((OPTIND - 1))

if (($# == 0))
then
    echo "No positional arguments specified"
fi

if ! $rflag && [[ -d $1 ]]
then
    echo "-r or -R must be included when a directory is specified" >&2
    exit 1
fi

これは関数の完全な参照実装を表していgetoptsますが、より大きなスクリプトのスケッチにすぎません。

于 2012-07-01T04:08:25.127 に答える