Answers:
shift $((OPTIND-1))
(注意OPTIND
是大写)通常在getopts
while
循环后立即发现。$OPTIND
是由找到的选项数量getopts
。
正如pauljohn32在评论中提到的,严格来说,OPTIND
它给出了下一个命令行参数的位置。
从GNU Bash参考手册:
getopts optstring名称[args]
getopts
由Shell脚本用于解析位置参数。optstring
包含要识别的选项字符;如果一个字符后跟一个冒号,则该选项应具有一个参数,该参数应由空格分隔。冒号(':')和问号('?')不能用作选项字符。每次调用它时,都getopts
将下一个选项放在外壳变量名称中,初始化该变量(name
如果不存在)以及要处理的下一个参数的索引到变量中OPTIND
。OPTIND
每次调用shell或shell脚本时,初始化为1。当选项需要一个参数时,getopts将该参数放入变量中OPTARG
。外壳不重置OPTIND
自动 如果要使用getopts
一组新的参数,则必须在同一外壳调用内的多个调用之间手动将其重置 。当遇到选项结尾时,
getopts
以大于零的返回值退出。OPTIND
设置为第一个非选项参数的索引,名称设置为“?”。
getopts
通常分析位置参数,但是如果有更多的参数在给定的args
,getopts
解析那些代替。
shift
n从位置参数列表中
删除n个字符串。因此shift $((OPTIND-1))
,getopts
将从参数列表中删除所有已解析的选项,因此在此之后,$1
将引用传递给脚本的第一个非选项参数。
更新资料
正如mikeserv在评论中提到的那样,shift $((OPTIND-1))
可能是不安全的。为防止不必要的单词拆分等,所有参数扩展都应加双引号。所以命令的安全形式是
shift "$((OPTIND-1))"
find
)可能看起来像在非选项之后允许选项,但它们却不允许:它们的操作数以破折号开头。
IFS
,但是安全起着总比后悔好。;)
IFS=0123456789
,shift $((OPTIND-1))
(不带引号)将变成shift ""
静默地被忽略(在中ksh
)或生成错误(在bash
和中dash
)。