getopts - como evitar ler o próximo $ OPTARG como argumento?

1

Acabou de começar a usar getopts e encontrou um problema ...

Por exemplo - tenha um script com:

while getopts "h:loav" opt; do
case $opt in
h)
  h=$OPTARG
  echo $h
  ;;

Mas, embora eu execute:

$ ./ftpclean.sh -h -l
-l

Eu tenho a segunda opção como argumento para a primeira opção ... Então - se o usuário esqueceu o argumento set:

$ ./ftpclean.sh -h argument
argument

getopts definirá echo *second option* ...

Existe alguma maneira "legal" de evitá-lo?

A melhor solução que encontrei - é adicionar função:

function checkargs () {
if [[ $OPTARG =~ ^-[a/l/o/a/v]$ ]]
  then
  echo "OPTERR"
  exit 1
fi
}

E execute-o antes de definir a variável:

 while getopts "h:loav" opt; do
  case $opt in
h)
  checkargs
  h=$OPTARG
  echo $h
  ;;

Então agora:

$ ./ftpclean.sh -h -l
OPTERR
    
por setevoy 15.11.2013 / 18:43

1 resposta

1

getopts h: diz que a opção -h requer um argumento. O argumento para uma opção pode estar na mesma palavra que a própria opção, ou se não houver nada lá na próxima palavra. A única maneira de especificar um argumento vazio é passar uma palavra vazia após a opção.

Quando você escreve ./ftpclean.sh -h -l , -l é o argumento para a opção -h . Você também pode escrever ./ftpclean.sh -h-l . Se você quiser passar um argumento vazio para -h , escreva ./ftpclean.sh -h '' -l .

Parece que você quer violar a convenção de argumentos Unix e exigir que os argumentos estejam na mesma palavra que o comando. Se você quiser fazer isso (o que eu recomendo strongmente, porque você vai confundir os usuários e fazê-los te xingar por fazer algo fora do padrão sem justificativa), getopts não vai te ajudar muito, você seria melhor fazendo sua própria análise.

    
por 17.11.2013 / 23:34