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 ))
例如,我不清楚:
为什么看起来不需要
shift
内循环?访问是否
getopts
会移动争论本身,或者它是如何工作的?为什么需要
shift
aftergetopts
?我不明白为什么
getopts
最后不自己这样做。
答案1
您不需要
shift
(也不应该)进入循环,因为getopts
通过更新变量来跟踪它正在处理的位置参数OPTIND
。你不需要to
shift
循环之后:您可以使用它OPTIND
来确定要自己处理哪些位置参数。使用shift
然而是处理已由 处理的参数的最简单方法getopts
,假设您不需要自己对它们进行后处理。
拥有getopts
不是shift 本身有几个好处:如有必要,您可以自己重新访问参数,并且可以重现原始命令行。后者很有用,例如在错误消息中,或者如果您需要使用相同的参数运行另一个命令(我知道我过去使用过它)。