Bashスクリプトで順序に依存しないオプションを実装する標準的な方法は何ですか? [コピー]

Bashスクリプトで順序に依存しないオプションを実装する標準的な方法は何ですか? [コピー]

重複の可能性:
シェルスクリプトでスイッチを処理する方法は?

最も一般的なシェルコマンドを使用すると、ユーザーは任意の順序でオプションを指定できます。$1一方、bashで一般的に使用される位置パラメータ(私はすべてのスクリプトをBashとして書く傾向がありますが、この質問は実際にBashに固有のものではないと思います)のように、スクリプトは順序によって異なります。

今私は見つけることができます一部オプションの引数を指定するときに、bashスクリプトユーザーが特定の順序に従うように要求しない方法です。 (拡張子に特定のオプションがあるかどうかをテストするために正規表現またはグローバル変数を使用しようとしました$@。)しかし、そのようなオプションを実装する特別な標準的な方法があるかどうかを知りたいです。オプションの共通構文(例:-r多くのシェルコマンド)を考えると、明らかにする必要があると思います。

答え1

getopt指定されたパラメータのすべての順序をサポートしますgetopts。使いやすく、パラメータ解析のための標準的な解決策に見えます。

よく言及される2つの違いは次のとおりです。

  • getopt長いオプションをサポートしています--help
  • getoptsスタンドアロンプ​​ログラムではなく、組み込みのBashシェルです。

幅広い簡素化はい:

# Process parameters
params="$(getopt -o e:hv \
    -l exclude:,help,verbose \
    --name "$0" -- "$@")"

if [ $? -ne 0 ]
then
    usage
fi

eval set -- "$params"
unset params

while true
do
    case $1 in
        -e|--exclude)
            excludes+=("${2-}")
            shift 2
            ;;
        -h|--help)
            usage
            exit
            ;;
        -v|--verbose)
            verbose='--verbose'
            shift
            ;;
        --)
            shift
            if [ -z "${1:-}" ]
            then
                error "Missing targets." "$help_info" $EX_USAGE
            fi
            if [ -z "${2:-}" ]
            then
                error "Missing directory." "$help_info" $EX_USAGE
            fi
            targets=(${@:1:$(($#-1))})
            source_dir="${@:$#}"
            break
            ;;
        *)
            usage
            ;;
    esac
done

関連情報