You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用getopts后执行位置参数偏移(shift)的目的是什么?

为什么要执行 shift "$(( OPTIND - 1 ))"

当用getopts处理脚本的命令行选项时,OPTIND会记录下下一个待处理的位置参数的索引。比如你执行脚本时输入./script.sh -a -b foo bar,getopts处理完-a和-b后,OPTIND的值会变成3,指向第一个非选项参数foo。

这时候执行shift "$(( OPTIND - 1 ))",就是把前面已经被getopts处理过的(也就是前2个)位置参数从参数列表里移除。执行完之后,原来的$1就变成了foo,$2变成bar,剩下的参数就都是纯粹的非选项参数了,后面的脚本逻辑可以直接用$1、$2来处理这些业务参数,不用再管前面的选项。

举个简单例子:

#!/bin/bash
while getopts "ab" opt; do
  case $opt in
    a) echo "处理选项-a" ;;
    b) echo "处理选项-b" ;;
  esac
done
shift "$(( OPTIND - 1 ))"
echo "剩余的非选项参数:$@"

运行./test.sh -a -b hello world,输出就是:

处理选项-a
处理选项-b
剩余的非选项参数:hello world

简单说,这个操作的核心目的就是清理掉已经处理完毕的选项参数,让脚本可以更方便地处理剩下的非选项业务参数。

内容的提问来源于stack exchange,提问作者Dilna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:39:56