getoptsループ変換 - 説明が必要

getoptsループ変換 - 説明が必要

shift誰かがこの単純なパーサーコードに何が必要かを明確にしてくれたらうれしいです。

while getopts ":hp:" option
do
    case "${option}" in
        p)
            some_parameter=${OPTARG}
            ;;
        h)
            print_usage_and_exit 0
            ;;
        *)
            print_usage_and_exit 1
            ;;
    esac
done

shift $(( OPTIND - 1 ))

たとえば、私にとっては明確ではありません。

  1. shiftなぜ内部ループが必要ないと思いますか?

    アクセスは引数自体を移動しますかgetopts、それともどのように機能しますか?

  2. shiftなぜ後に必要ですかgetopts

    getoptsなぜ自分でその仕事を終わらなかったのか理解できません。

答え1

  1. 変数を更新して処理中の位置引数を追跡するshiftため、ループに入る必要はありません。getoptsOPTIND

  2. あなたはしません必要toループshift後:これを使用して、OPTIND自分で処理する場所パラメータを決定できます。ただし、を使用するshiftことは、ですでに処理されたパラメータを処理する最も簡単な方法です。getoptsただし、パラメータを直接事後処理する必要はありません。

持つgetopts いいえShift自体にはいくつかの利点があります。必要に応じて、パラメータに直接アクセスして元のコマンドラインを再現できます。後者は、たとえばエラーメッセージで役に立つか、同じパラメータを使用して別のコマンドを実行する必要がある場合に便利です(過去に使用したことがあります)。

関連情報