Почему "getopts" внутри функции не работает?

function readArgs() {
    while getopts "i:o:p:s:l:m" OPTION; do
        case "$OPTION" in
            i)
                input="$OPTARG"
                ;;
            o)
                output="$OPTARG"
                ;;
            ...
        esac
    done
}

readArgs

if [[ -z "$input" ]]; then
    echo "Not set!"
fi

Это всегда дает мне Not set!, но если я прокомментирую строки function readArgs() {, } и readArgs, это сработает. Почему?

Кроме того,

input="$OPTARG"
echo "$input"
;;

не работает.

Ответ 1

getopts анализирует аргументы функции readArgs, и вы не даете этой функции никаких аргументов.

Попробуйте:

readArgs "[email protected]"

Ответ 2

getopts полагается на переменную OPTIND, инициализированную на 1. Либо сделайте

readArgs() { OPTIND=1; ...

или

readArgs() { local OPTIND; ...