Bash getops: permitir, mas não requerer arg

1

Estou escrevendo um script bash, analisando opções com getopts como este:

    #!/bin/bash

    while getopts ab: ; do
        case $opt in
          a) AOPT=1
             ;;
          b) BOPT=$OPTARG
             ;;
        esac
    done

Eu gostaria de ter a opção "-b" OPCIONALMENTE aceita um argumento, mas, como é, o getopts reclama se nenhum argumento for passado. Como posso conseguir isso?

Obrigado!

    
por Frank Brenner 06.05.2011 / 06:26

1 resposta

4

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 = 
    
por 06.05.2011 / 07:44