Опции сценария оболочки с парсингом аргументов

У меня есть сценарий оболочки

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

но его выполнение как это./create_endpoint.sh 10.10.10.1

Я хочу выполниться как это /create_endpoint.sh --controller-ip 10.10.10.1

1
задан 30 April 2016 в 16:59

3 ответа

Эти getopt команда используется для парсинга опций в сценариях удара существует замечательный гид по его использованию здесь .

можно установить долгие или короткие опции, и также определить, имеет ли опция обязательные или дополнительные аргументы с использованием : или ::.

не путают его с ударом, встроенным getopts, который может только считать короткие опции и процессы немного по-другому.

я нашел этот руководство к различиям между двумя простой и простой.

4
ответ дан 3 December 2019 в 06:21

Намного лучше использовать генератор кода такой в качестве Argbash, который сгенерирует код обработки аргумента для Вас. Существуют также универсален библиотеки удара для аргумента, анализирующего , но необходимо было бы распределить их со сценарием, и они довольно длинны и сложны.

, Почему?

  • предложение ответа с помощью getopt не является хорошим выбором - его поддержка долгих опций является расширением GNU, таким образом, сценарии с помощью него не являются портативными. Плюс getopt имеет его собственные проблемы помимо этого.
  • предложение ответа, пишущий bash код парсинга аргумента также имеет проблему - поддержание относительно длинного рукописного кода как это не чувствует себя хорошо.

Наконец, аргументы, которые начинаются с тире, обычно известны как дополнительный и рассматривают как таковые - они не должны требоваться и если они опущены, разумное значение по умолчанию должно быть доступным. Поэтому исходный сценарий, которым Вы так или иначе недовольны, может на самом деле быть лучшее решение.

1
ответ дан 3 December 2019 в 06:21

Что-то вроде этого:

#!/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"

Примеры

$ ./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

Поскольку OP прокомментировала:

Я не хочу опции справки.

#!/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"
4
ответ дан 3 December 2019 в 06:21

Другие вопросы по тегам:

Похожие вопросы: