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