bashgetopts

Why does getopts only work the first time?


Why does this option only work the first time it's used, then ignored every other time? It's like it's being reset when the option is not used.

Here's my function:

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

When running it, it only returns true when passing the option for the first time.

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

Solution

  • You need to add this line at top of your function:

    OPTIND=1
    

    Otherwise successive invocation of the function in shell are not resetting this back since function is being run in the same shell every time.

    As per 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.