O getopts builtin rastreia até que ponto ele passou pelas opções através da variável OPTIND . Na segunda vez que você executar a função, $OPTIND reteve seu valor da chamada anterior, portanto, o shell pensa que já terminou o processamento das opções. Consulte a descrição de getopts no manual para obter mais informações.
Declare OPTIND e OPTARG como locais para a função.
Existe outro erro na sua função, que é o ~ não expandido entre aspas duplas. Faça com que local cdir=~/mydirectory ou local cdir="$HOME/mydirectory"