seção de análise de argumentos padrão

1

Eu criei um script bash no qual gostaria de adicionar opções de ajuda como -h , --help , --verbose e algumas outras.

Se eu criá-lo como descrito aqui isso será um solução padrão?

# Execute getopt on the arguments passed to this program, identified by the special character $@
PARSED_OPTIONS=$(getopt -n "$0"  -o h123: --long "help,one,two,three:"  -- "$@")

#Bad arguments, something has gone wrong with the getopt command.
if [ $? -ne 0 ];
then
  exit 1
fi

# A little magic, necessary when using getopt.
eval set -- "$PARSED_OPTIONS"


# Now goes through all the options with a case and using shift to analyse 1 argument at a time.
#$1 identifies the first argument, and when we use shift we discard the first argument, so $2 becomes $1 and goes again through the case.
while true;
do
  case "$1" in

    -h|--help)
      echo "usage $0 -h -1 -2 -3 or $0 --help --one --two --three"
     shift;;

    -1|--one)
      echo "One"
      shift;;

    -2|--two)
      echo "Dos"
      shift;;

    -3|--three)
      echo "Tre"

      # We need to take the option of the argument "three"
      if [ -n "$2" ];
      then
        echo "Argument: $2"
      fi
      shift 2;;

    --)
      shift
      break;;
  esac
done

Ou existe outra maneira definida de como implementar isso?

    
por rubo77 04.07.2014 / 09:43

1 resposta

1

Na verdade, é muito comum que os shell scripts escrevam sua própria análise de argumento usando uma declaração case de maneira muito semelhante a você. Agora, seja ou não a melhor solução ou a mais padrão, está em debate. Pessoalmente, por causa da minha experiência com C, eu prefiro usar um utilitário chamado getopt .

Na página getopt.1 man:

getopt is used to break up (parse) options in command lines for easy parsing by shell procedures, and to check for legal options. It uses the GNU getopt(3) routines to do this.

Considerando que você já está chamando getopt , eu diria que você está exatamente no caminho certo. Se você quisesse, poderia simplesmente iterar os argumentos da linha de comando com uma instrução case para lidar com os casos; mas, como você provavelmente já descobriu, getopt faz todo esse trabalho pesado para você.

TL; DR: É um script de shell, você pode implementá-lo como quiser; mas getopt é uma ótima utilidade para isso.

    
por 04.07.2014 / 10:24

Tags