nega o uso de múltiplos argumentos getopts

1

Estou tentando descobrir uma maneira de negar o uso de mais de um argumento de getopts em uma determinada situação. Digamos que tenhamos algo assim:

while getopts "a:b:c:def" variable; do
case $variable in
a)a=$OPTARG
b)b=$OPTARG
c)c=$OPTARG
d)MODE=SMTH
e)MODE=SMTH2
f)MODE=SMTH3
esac
done

O que estou tentando fazer é negar o uso de mais de um MODE arg (def) e exibir uma mensagem para dizer isso ao usuário. Algo na linha de:

./script.sh -a ajhsd -b kjdhas -c daskjdha -d -e -f

executa a verificação para uso de mais de um argumento MODE (def) e se mais de um for usado, exibe uma mensagem de erro. Eu tentei com uma simples verificação de entrada se declaração, mas falhou miseravelmente. Ele sempre passa por todos os três e obtém o último parâmetro de argumento transmitido sem nem mesmo entrar na verificação de múltiplos argumentos. Meio estranho. Deveria ter sido fácil fazer isso. Deveria ter ...

    
por Nikolai Uzunov 21.03.2016 / 16:56

1 resposta

4

Você precisa inicializar MODE como algum valor diferente de SMTH , SMTH2 e SMTH3 . Em seguida, verifique se MODE está no valor inicial. Caso contrário, envie uma mensagem de erro e saia. Você precisa sair após o erro, caso contrário, o script continuará sendo executado. A versão modificada do seu script abaixo deve ajudá-lo a começar.

MODE=0
EMSG="More than one of -d, -e, -f has been specified"
while getopts "a:b:c:def" variable; do
case $variable in
a) a=$OPTARG ;;
b) b=$OPTARG ;;
c) c=$OPTARG ;;
d) if [ $MODE = 0 ] ; then MODE=SMTH  ; else  echo $EMSG  ; exit 1 ; fi ;;
e) if [ $MODE = 0 ] ; then MODE=SMTH2 ; else  echo $EMSG  ; exit 1 ; fi ;;
f) if [ $MODE = 0 ] ; then MODE=SMTH3 ; else  echo $EMSG  ; exit 1 ; fi ;;
esac
done
    
por 21.03.2016 / 17:47