Ao usar 'getopts' com 'case': '*)' como a última subclasse do padrão, ou '\?)' e ':)' como as duas últimas subcláusulas do padrão?

0

Ao usar a cláusula getopts with case , uma subcláusula *) pattern é a última subclasse do padrão equivalente à união das subcláusulas \?) e :) pattern como as duas últimas subcláusulas do padrão? Especificamente,

while getopts "<optionString>" opt; do
    case $opt in
        a) a="$OPTARG"
           ;;
        b) b="$OPTARG"
           ;;

        ...
           ;;

        \?) printf "illegal option: -%s\n" "$OPTARG" >&2
            exit 1
            ;;
        :) printf "missing argument for -%s\n" "$OPTARG" >&2
           exit 1
           ;;
    esac
done

e

while getopts "<optionString>" opt; do
    case $opt in
        a) a="$OPTARG"
           ;;
        b) b="$OPTARG"
           ;;

        ...
           ;;

        *) printf "illegal option: -%s, or missing argument for -%s\n" "$OPTARG" "$OPTARG" >&2
            exit 1
            ;;
    esac
done

Obrigado.

    
por Tim 25.02.2018 / 17:08

1 resposta

1

Você realmente só precisa verificar : e ? com getopts em bash se você usar relatórios de erros silenciosos (quando o primeiro caractere de optstring for dois pontos).

Quando getopts não for usado dessa forma, ele produzirá suas próprias mensagens de diagnóstico para opções inválidas e para argumentos de opção ausentes (e geralmente são bastante adequados). Na verdade, ele não colocará : ou ? na variável, a menos que seja silenciado.

Usar * em uma declaração de caso seria uma maneira de capturar ambos, mas se getopts for silenciado, você não saberia qual erro foi acionado e seria capaz de dizer algo nas linhas de an error occurred while parsing the command line options para o usuário.

    
por 25.02.2018 / 17:21

Tags