0

私は次のスクリプトを持っています:

#!/bin/bash

USER="NONE"
LOST=0
AVG=0

while getopts ":pmu:" OPTION; do
    case $OPTION in
        u)
            USER=$OPTARG
            ;;
        p)
            LOST=1
            ;;
        m)
            AVG=1
            ;;
        \?)
            echo "Invalid argument: -$OPTARG"
            exit 1
            ;;
        :)
            echo "-$OPTARG requires an argument."
            exit 1
            ;;
    esac
done

echo "$USER-$LOST-$AVG"

exit 0

-u引数を取るオプションが必要です。スクリプトは、無効なオプションを正しく認識し-u、引数なしで呼び出された場合を認識します。しかし、残念ながら、私が入力すると:

myscript -u -m -p

それは印刷します:

-m-1-0

したがって、引数として使用-mし、オプション自体-uを無視します。-m

4

1 に答える 1

2

オプションの後にオプション引数が続く と言いましgetoptsた。文字列値です。記号で始まるという事実は、オプション引数としてのステータスにとって重要ではありません。オプション引数値の先頭で使用できます。-u-m--

したがって、あなたの観察は正しいです。これが意図した設計です。これがgetopt()関数の動作方法であり、POSIX Utility Syntax Guidelinesの実装です。実際には、これらのガイドラインのわずかに緩和されたバージョンです。気に入らない場合は、 以外のものを使用してgetoptsください。ただし、システムと戦うことになります。

POSIXgetopt()では理論上は「オプションのオプション引数」が許可されていますが、実際には、コマンド ラインの最後のオプションのみがオプションのオプション引数を持つことができるため、それらは本質的に役に立たないことに注意してください。

異なる動作をし、ユーティリティ構文ガイドラインを実質的に満たすオプション解析システムを考案することは完全に可能です。多くの人がそれをしました。確かに、GNUgetoptプログラムは拡張された実装であり、おそらくあなたが見るべきものです — しかし、動作に到達するための非常に異なる呼び出しがあります (長いコマンドライン オプションと短いコマンド ライン オプションを取得するために bash シェル スクリプトで使用getoptsする も参照してください)。システムはすべて異なり、必要なオプション処理の動作を簡潔かつ明確に説明するのは通常複雑です。詳細については、「 Solaris CLIP — コマンド ライン インターフェイス パラダイム」を参照してください*

* Google 検索用語「solaris クリップ」で、映画「Solaris」のムービー クリップを取得できます。有効な検索用語は、「Solaris コマンド ライン インターフェイス パラダイム」です。

于 2013-04-21T14:59:16.100 に答える