为什么 getopts 只在第一次起作用?

Why does getopts only work the first time?

为什么这个选项只在第一次使用时有效,然后每隔一段时间就被忽略了?好像在不使用该选项时正在重置。

这是我的函数:

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

当运行它时,只有在第一次传递选项时才returns为真。

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

您需要在函数顶部添加这一行:

OPTIND=1

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

根据help getopts

Each time it is invoked, getopts will place the next option in the shell variable $name, initializing name if it does not exist, and the index of the next argument to be processed into the shell variable OPTIND. OPTIND is initialized to 1 each time the shell or a shell script is invoked.

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

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