为什么getopts只能在第一次工作?

时间:2017-01-13 21:00:43

标签: bash getopts

为什么此选项仅在第一次使用时才起作用,然后每隔一段时间忽略一次?就像在没有使用该选项时重置它一样。

这是我的功能:

testopts() {
    local var="o false"
    while getopts "o" option; do
        case "${option}" in
            o)
                var="o true"
                ;;
        esac
    done
    echo $var
}

运行时,只有在第一次传递选项时才返回true。

$ testopts
o false
$ testopts -o
o true
$ testopts -o
o false

2 个答案:

答案 0 :(得分:3)

您需要在功能顶部添加此行:

OPTIND=1

否则在shell中连续调用函数不会重置此函数,因为函数每次都在同一个shell中运行。

根据help getopts

  

每次调用它时,getopts都会将下一个选项放入       shell变量$name,如果名称不存在则初始化名称,以及       要处理到shell中的下一个参数的索引       变量OPTIND。每次shell或者 OPTIND初始化为1       调用shell脚本。

答案 1 :(得分:0)

OPTIND 重置为 1 是可行的,但在函数中使用 OPTIND 时,最好将 getopts 声明为局部变量。

https://eklitzke.org/using-local-optind-with-bash-getopts