Opções de script de shell com argumentos de análise

1

Eu tenho o script de shell

CONTROLLER_IP=""
if [ "$#" -eq 1 ]
then
    CONTROLLER_IP=$1
else
    echo "Usage : create_endpoint.sh --controller-ip <Controller IP>"
    exit 1
fi

mas sua execução é assim. /create_endpoint.sh 10.10.10.1

Eu quero executar assim /create_endpoint.sh --controller-ip 10.10.10.1

    
por Beginner 03.07.2015 / 10:48

3 respostas

4

Algo parecido com isto:

#!/bin/bash
CONTROLLER_IP=""

while [ "$1" != "" ]; do
  case $1 in
    -c|--controller-ip)
      if [ -n "$2" ]; then
        CONTROLLER_IP="$2"
        shift 2
        continue
      else
        echo "ERROR: '--controller-ip' requires a non-empty option argument."
        exit 1
      fi
        ;;
    -h|-\?|--help)
      echo "Usage: $(basename $0) --controller-ip <ip>"
      exit
      ;;
    --)              # End of all options.
      shift
      break
      ;;
    -?*)
      echo "WARN: Unknown option (ignored): $1"
      ;;
    *)               # Default case: If no more options then break out of the loop.
      break
  esac
  shift
done

echo "$CONTROLLER_IP"

Exemplos

$ ./foo --controller-ip 192.168.2.1
192.168.2.1

$ ./foo -c 192.168.2.1
192.168.2.1

$ ./foo --controller-ip
ERROR: '--controller-ip' requires a non-empty option argument.

$ ./foo --help
Usage: foo --controller-ip <ip>

$ ./foo -help
WARN: Unknown option (ignored): -help

Como OP comentou:

I don't want help option.

#!/bin/bash
CONTROLLER_IP=""

while [ "$1" != "" ]; do
  case $1 in
    -c|--controller-ip)
      if [ -n "$2" ]; then
        CONTROLLER_IP=$2
        shift 2
        continue
      else
        echo "ERROR: '--controller-ip' requires a non-empty option argument."
        exit 1
      fi
        ;;
    --)              # End of all options.
      shift
      break
      ;;
    -?*)
      echo "WARN: Unknown option (ignored): $1"
      ;;
    *)               # Default case: If no more options then break out of the loop.
      break
  esac
    shift
done

echo "$CONTROLLER_IP"
    
por A.B. 03.07.2015 / 11:22
4

O comando getopt é usado para analisar opções em scripts bash, há um ótimo guia para seu uso aqui .

Você pode definir opções longas ou curtas e também especificar se a opção tem argumentos obrigatórios ou opcionais com o uso de : ou :: .

Não confunda com o bash criado em getopts , que só pode ler opções curtas e processar de maneira um pouco diferente.

Eu encontrei este guia para as diferenças entre os dois simples e simples.

    
por Arronical 03.07.2015 / 11:57
1

É muito melhor usar um gerador de código como o Argbash , que gerará o código de manipulação de argumento para você. Também há bibliotecas universais de bash para análise de argumentos , mas você teria que distribuí-las com seu script e eles são bastante longos e complexos.

Por quê?

  • A resposta sugerindo usar getopt não é uma boa escolha - seu suporte a opções longas é uma extensão GNU, portanto, os scripts que a usam não são portáteis. Além disso, getopt tem seus próprios problemas além disso.
  • A resposta sugerindo escrever código de análise de argumento bash também tem um problema - manter um código manuscrito relativamente longo como este não parece certo.

Finalmente, os argumentos que começam com traços são comumente conhecidos como opcional e tratados como tal - eles não devem ser obrigatórios e, se forem omitidos, um padrão sensato deve estar disponível. Portanto, o roteiro original do qual você está de alguma forma infeliz pode, na verdade, ser a melhor solução.

    
por bubla 03.05.2017 / 23:11