Perguntas sobre como entender um modelo de uso de getopts de bash

0

Uma postagem stackoverflow tem um modelo para manipular argumentos de linha de comando.

O teste [ $# == 0 ] significa que um script bash não deve ser executado sem nenhum argumento? Como modelo, acho que os scripts geralmente não requerem necessariamente nenhum argumento.

Na declaração case , quão diferentes são os dois casos *) e "?") ? Eles parecem iguais.

# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
    echo $USAGE
    exit 1;
fi

while getopts ":i:vh" optname
  do
    case "$optname" in
      "v")
        echo "Version $VERSION"
        exit 0;
        ;;
      "i")
        echo "-i argument: $OPTARG"
        ;;
      "h")
        echo $USAGE
        exit 0;
        ;;
      "?")
        echo "Unknown option $OPTARG"
        exit 0;
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        exit 0;
        ;;
      *)
        echo "Unknown error while processing options"
        exit 0;
        ;;
    esac
  done

shift $(($OPTIND - 1))

param1=$1
param2=$2
    
por Ben 22.11.2018 / 13:32

2 respostas

2

Este script requer pelo menos um argumento, se não exibir informações de uso. Deve fazer echo $USAGE >&2 , pois isso é um erro. Outros scripts podem funcionar com zero argumentos, então você terá que modificar. Assim como alguns não aceitam o argumento i .

"?", vs *

Sim, eles são diferentes:

  • "?" diz para procurar um ? . Isso é o que getopts retorna quando encontra uma opção que não espera (opção inválida).
  • * diz para o caso, fazer isso é você não encontrar nenhum outro jogo. Isso não deveria acontecer, mas pode acontecer. Provavelmente indica um bug no getopts, ou mais provavelmente o seu programa (veja programação defensiva).
por 22.11.2018 / 13:48
2

Eles devem ser o mesmo.

No entanto, esse código tem sua própria parcela de problemas:

  • falha em citar expansões aritméticas; deve ser shift "$(($OPTIND - 1))"
  • uso do operador == não suportável
  • mensagens de erro gravadas no stdout
  • sair com status 0 (sucesso) em caso de erro
  • falha em citar variáveis; deve ser "$#" e echo "$USAGE"
  • mau posicionamento da verificação if-no-arguments; deve ser após o loop getopts, para não ser enganado por script --
  • cotação inútil de v , h , i e :i:vh
por 22.11.2018 / 17:13