KSH - valor de argumento de opção desconhecido do getopts interno

3

Estou tentando usar os getopts internos do ksh para gerenciar as opções de tempo de execução para o meu código ksh.

Eu continuo recebendo o erro: "valor do argumento da opção desconhecida" ao usar uma opção que requer e argumento.

Este é o código incorreto:

$ cat usage.sh
#!/bin/ksh
#set -xv

USAGE=$'[-?\n@(#)$Id: '"script_name"
USAGE+=$'\n'"script_version"$' $\n]'
USAGE+="[m:mode?Sets notification mode.]:[mode:=ALL]"
USAGE+="{[mode=SMS?SMS notification][mode=MAIL?EMAIL notification][mode=ALL?EMAIL and SMS notification]}"

while getopts "$USAGE" optchar;
    do
        case $optchar in
            m)  case "$OPTARG" in
                    MAIL) echo -e "-m MAIL:\tOK!"
                        ;;
                    SMS) echo -e "-m SMS:\tOK!"
                        ;;
                    ALL) echo -e "-m ALL:\tOK!"
                        ;;
                esac
                ;;

        esac
    done

E aqui alguma saída:

$ ./usage.sh --man
SYNOPSIS
  ./usage.sh [ options ]

OPTIONS
  -m, --mode=mode Sets notification mode.
                    mode=SMS
                          SMS notification
                    mode=MAIL
                          EMAIL notification
                    mode=ALL
                          EMAIL and SMS notification
                  The default value is ALL.

IMPLEMENTATION
  version         script_name script_version

$ ./usage.sh -m SMS
./usage.sh: -m: SMS: unknown option argument value
Usage: ./usage.sh [-m mode]

$ ./usage.sh -m pippo
./usage.sh: -m: pippo: unknown option argument value
Usage: ./usage.sh [-m mode]

Eu criei essa opstring horrivelmente complexa depois do O'Reilly - Learning the Korn Shell .

Se eu comentar a quarta linha de definição USAGE, o valor do argumento da opção é o seguinte:

$ ./usage.sh --man
SYNOPSIS
  ./usage.sh [ options ]

OPTIONS
  -m, --mode=mode Sets notification mode. The default value is ALL.

IMPLEMENTATION
  version         script_name script_version

$ ./usage.sh -m SMS
-m SMS: OK!

$ ./usage.sh -m pippo
(nothing)

O que eu entendo como getopts não está verificando valores permitidos para argumentos.

Como posso obter o getopts contra valores de argumento não permitidos, de forma que ele não bloqueie os valores permitidos?

$ ksh --version
  version         sh (AT&T Research) 93u+ 2012-08-01
    
por Dariopnc 22.08.2016 / 15:42

2 respostas

0

Publicando isso como memorando, o código a seguir funciona como pretendido:

#!/bin/ksh
#set -xv

USAGE=$'[-?\n@(#)$Id: '"script_name"
USAGE+=$'\n'"script_version"$' $\n]'
USAGE+="[m:mode?Sets notification mode.]:[mode:=ALL]"
USAGE+="{[S:SMS?SMS notification][M:MAIL?EMAIL notification][A:ALL?EMAIL and SMS notification]}"

while getopts "$USAGE" optchar;
    do
        case $optchar in
            m)  case "$OPTARG" in
                    M) echo -e "-m MAIL:\tOK!"
                        ;;
                    S) echo -e "-m SMS:\tOK!"
                        ;;
                    A) echo -e "-m SA:\tOK!"
                        ;;
                esac
                ;;

        esac
    done

Aqui está a saída:

$ ./usage.sh --man
SYNOPSIS
  ./usage.sh [ options ]

OPTIONS
  -m, --mode=mode Sets notification mode.
                    SMS   SMS notification
                    MAIL  EMAIL notification
                    ALL   EMAIL and SMS notification
                  The default value is ALL.

IMPLEMENTATION
  version         script_name script_version

$ ./usage.sh -m SMS
-m SMS: OK!

$ ./usage.sh -m pippo
./usage.sh: -m: pippo: unknown option argument value
Usage: ./usage.sh [-m mode]

Dessa forma, -m SMS é equivalente a -m S .

    
por 23.08.2016 / 17:50
1

Parece que você definiu a opção "ALL" duas vezes:

USAGE+="[m:mode?Sets notification mode.]:[mode:=ALL]"
USAGE+="{[mode=SMS?SMS notification][mode=MAIL?EMAIL notification][mode=ALL?EMAIL and SMS notification]}"

Basta remover o primeiro:

USAGE+="[m:mode?Sets notification mode.]:"
USAGE+="{[mode=SMS?SMS notification][mode=MAIL?EMAIL notification][mode=ALL?EMAIL and SMS notification]}"
    
por 22.08.2016 / 20:33

Tags