Você pode executar o getopts no modo silencioso incluindo dois pontos como o primeiro caractere do optstring. Isso pode ser usado para suprimir a mensagem de erro.
Na página de manual do getopts:
If the first character of optstring is a colon, the shell variable specified
by name shall be set to the colon character and the shell variable OPTARG shall
be set to the option character found.
Assim, algo como o seguinte pode funcionar para você:
#!/bin/bash
AOPT="unassigned"
BOPT="unassigned"
while getopts :ab: opt ; do
case $opt in
a) AOPT=1
;;
b) BOPT=$OPTARG
;;
:) BOPT=
;;
esac
done
echo "AOPT = $AOPT"
echo "BOPT = $BOPT"
Alguns exemplos:
rlduffy@hickory:~/test/getopts$ ./testgetopts -a -b Hello
AOPT = 1
BOPT = Hello
rlduffy@hickory:~/test/getopts$ ./testgetopts -b goodbye
AOPT = unassigned
BOPT = goodbye
rlduffy@hickory:~/test/getopts$ ./testgetopts -a -b
AOPT = 1
BOPT =