在getopts之后使用shift $((OPTIND-1))的原因是什么?

Dav*_*ave 4 bash

我知道移CLI ARGS n间隔的阵列向左移动,并且n的默认值是1.这意味着我可以分配阵列现有可变因素使用$ 1 while循环移位的值.我不太明白为什么在下面这个背景下使用它.输入参数已经分配给值,删除shift $((OPTIND-1))不会改变这个事实.资料来源:http: //linux.die.net/man/3/optind

while getopts ":h:a:fc" opt; do
    case $opt in
        h)
            print_help
            exit 0
            ;;
        a)
            aaaa=${OPTARG}
            ;;
        f)
            force=1
            ;;
        c)
            CLEAN=1
            ;;
        \?)
            echoerr "Invalid option -$OPTARG"
            print_help
            exit 1
            ;;
    esac
done

shift $((OPTIND-1))
Run Code Online (Sandbox Code Playgroud)

Ped*_*erg 13

该移位getopts从参数列表中删除循环处理的参数,以便脚本的其余部分可以以通常的方式处理命令行的剩余部分(如果有的话),而不用考虑选项的数量处理getopts.

考虑一个带有用法的假设脚本

frobble [-f] [-c] [-a hostname] filename ...
Run Code Online (Sandbox Code Playgroud)

getopts上面的循环负责解析的-f,-c并且-a,如果它们存在,但不会从参数列表中删除.这意味着要获取您的文件名参数,您需要找出处理了多少选项,并从那里继续处理.方便地,getopts告诉您第一个未处理的参数的索引:变量OPTIND.

而不是搞乱偏移和东西,你可以丢弃已处理的选项,重新编号其余的参数,以便你的文件名始终$1.

这是做什么的shift $((OPTIND-1)).

  • 这里忽略了“shift”语法。`shift [n]` 是一个 bash/sh 内置命令,它将参数索引移动 _n_。因此,例如,如果您的命令有 3 个参数,arg1、arg2 和 arg3,则 $1 将对应于 arg1,$2 将对应于 arg2,依此类推。如果您在脚本中调用 `shift 2`,则 $1 现在将对应于arg3。 (3认同)