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. 为什么需要shiftafter getopts

    我不明白为什么getopts最后不自己这样做。

答案1

  1. 您不需要shift(也不应该)进入循环,因为getopts通过更新变量来跟踪它正在处理的位置参数OPTIND

  2. 你不需要toshift循环之后:您可以使用它OPTIND来确定要自己处理哪些位置参数。使用shift然而是处理已由 处理的参数的最简单方法getopts,假设您不需要自己对它们进行后处理。

拥有getopts 不是shift 本身有几个好处:如有必要,您可以自己重新访问参数,并且可以重现原始命令行。后者很有用,例如在错误消息中,或者如果您需要使用相同的参数运行另一个命令(我知道我过去使用过它)。

相关内容