在`shift $(($OPTIND -1))`中使用shift命令

在`shift $(($OPTIND -1))`中使用shift命令

我确实看到了帖子解释 shell 命令移位。由于我无法在那里发表评论,我想知道 Shift 命令的用法。这是否意味着在使用shift之后传递给脚本的参数将为空?该命令有什么好处

答案1

它可能会导致空的 arg 列表,也可能不会。这取决于有多少个参数开始,以及有多少个相关参数getopts找到(并在 $OPTIND 中设置)。 getopts 忽略所有不以 开头的参数-,并--告诉 getopts 停止将任何后续参数作为选项处理(例如rm -f -- -filenamebeginningwith-.txt)。

例如,如果你有 5 个 args -x -y -z file1 file2,那么shift 3将删除前三个 args ,只留下file1 file2.

答案2

该命令的原因shift $((OPTIND -1))是“跳过”已解析的选项getopts,并保留文件类型参数以供进一步处理。

请注意,这是由shell 的内置命令$OPTIND管理的 shell 变量。getopts当 shell 启动时,$OPTIND等于 1,并且每次getopts调用发现选项或选项参数时都会递增。

shift从当前参数列表的开头删除任意数量的参数。

  • 调用shift 3将不可恢复地从 shell 的参数列表中删除前 3 个参数。

答案3

基本上,“shift”命令允许您“浏览”传递给脚本或函数的参数。

主要用途是在循环中访问 $0,同时“移动”直到没有更多参数为止。

shift $(($OPTIND-1)) 的确切用法是跳过 getopts 解析和标准化的选项(即 -uvh 会变成 -u -v -h),所以通过这样做,你将得到你的第一个“非-option”参数位于参数数组的 $0 位置。

答案4

一个演示可能会说明:

$ set -- 1 2 3 4 5 6  # set the positional parameter $1, $2, ...
$ echo "$@"   # print the positional params
1 2 3 4 5 6
$ shift 3
$ echo "$@"
4 5 6

现在,[ $1 -eq 4 ] && [ $2 -eq 5 ] && [ $3 -eq 6 ]

相关内容