Você tem vários problemas:
- Você está testando o número de argumentos antes que as opções tenham sido processadas. Antes que as opções sejam processadas, você não sabe quantos slots em argv estão ocupados por opções, então você não pode decidir se
$#
precisa estar entre 2 e 3 (como você propõe), ou qualquer outra coisa. Mesmo se você prever a presença de uma opção-e
, não saberá se ela virá como-eemail
(consome 1 argv slot) ou-e email
(consome 2 slots). Parece que você quer receber exatamente 2 argumentos não opcionais, então o que você precisa fazer é verificar se$#
é exatamente igual a 2 depois que as opções foram consumidas. -
[[ -v $EMAIL ]]
email não faz nenhum sentido. Isso testa se o valor de$EMAIL
designa uma variável de shell válida, o que não é o que você deseja. Você quis dizer algo como[ -n "$EMAIL" ]
-
getopts
não consome as opções, apenas as analisa. Depois de analisá-los, você deve passar por eles comshift $(($OPTIND-1))
. - Você está invocando o script incorretamente. As opções vêm antes dos argumentos, então o uso é
$0 [-e email] argument1 argument2
.