![在`shift $(($OPTIND -1))`中使用shift命令](https://linux22.com/image/75095/%E5%9C%A8%60shift%20%24((%24OPTIND%20-1))%60%E4%B8%AD%E4%BD%BF%E7%94%A8shift%E5%91%BD%E4%BB%A4.png)
我确实看到了帖子解释 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 ]