o getopt do util-linux ignora o primeiro argumento

1

Eu segui as postagens nos sites do stackexchange para analisar os argumentos da linha de comando. Meu programa só analisa argumentos longos e todos os argumentos são obrigatórios. Aqui está o que eu fiz:

getopt --test > /dev/null
if [[ $? -ne 4 ]]; then
    echo "getopt --test failed in this environment."
    exit 1
fi

function quit {
    echo "$1"
    exit 1
}

# Option strings
LONG="producer-dir:,consumer-dir:,username:,password:,url:,kafka-host:,checkpoint-dir:"

# read the options
OPTS=$(getopt --longoptions ${LONG} --name "$0" -- "$@")
if [ $? != 0 ]; then 
    quit "Failed to parse options...exiting."
fi

eval set -- "$OPTS"

# extract options and their arguments into variables.
while true ; do
  case "$1" in
    --producer-dir )
      PRODUCER_DIR="$2"
      shift 2
      ;;
    --consumer-dir )
      CONSUMER_DIR="$2"
      shift 2
      ;;
    --username )
      USERNAME="$2"
      shift 2
      ;;
    --password )
      PASSWORD="$2"
      shift 2
      ;;
    --url )
      URL="$2"
      shift 2
      ;;
    --kafka-host )
      KAFKA_HOST="$2"
      shift 2
      ;;
    --checkpoint-dir )
      CHECKPOINT_DIR="$2"
      shift 2
      ;;
    -- )
      shift
      break
      ;;
    *)
      echo "Internal error!"
      exit 1
      ;;
  esac
done

Não importa em que ordem eu passe os argumentos, o primeiro é ignorado e o resultado é vazio. O restante dos argumentos são analisados conforme o esperado. O que estou perdendo?

    
por Majid Azimi 16.01.2018 / 10:18

2 respostas

4

Eu acho que o que está acontecendo é que o que você pretende ser seu primeiro O parâmetro está sendo interpretado por getopt como optstring . o O início da página getopt man lista três sinopses. Você parece estar usando o segundo:

'getopt [options] [--] optstring parameters'

Observe como, após o -- , o primeiro item não é parameters , mas optstring .

Enquanto estamos nisso, devo mencionar que o bash tem uma versão interna de getopt , chamado getopts com o s à direita. Todas as outras coisas sendo igual, usar o recurso interno do bash deve ser mais eficiente.

    
por 16.01.2018 / 10:52
0

Eu tive exatamente o mesmo problema no RHEL7.3. Eu precisava definir as opções curtas também. Isso parece um erro!

    
por 31.01.2018 / 01:25