Why does getopts only work the first time?

Solution 1:

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.