У меня есть сценарий оболочки
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
Эти getopt
команда используется для парсинга опций в сценариях удара существует замечательный гид по его использованию здесь .
можно установить долгие или короткие опции, и также определить, имеет ли опция обязательные или дополнительные аргументы с использованием :
или ::
.
не путают его с ударом, встроенным getopts
, который может только считать короткие опции и процессы немного по-другому.
я нашел этот руководство к различиям между двумя простой и простой.
Намного лучше использовать генератор кода такой в качестве Argbash, который сгенерирует код обработки аргумента для Вас. Существуют также универсален библиотеки удара для аргумента, анализирующего , но необходимо было бы распределить их со сценарием, и они довольно длинны и сложны.
, Почему?
getopt
не является хорошим выбором - его поддержка долгих опций является расширением GNU, таким образом, сценарии с помощью него не являются портативными. Плюс getopt
имеет его собственные проблемы помимо этого. bash
код парсинга аргумента также имеет проблему - поддержание относительно длинного рукописного кода как это не чувствует себя хорошо. Наконец, аргументы, которые начинаются с тире, обычно известны как дополнительный и рассматривают как таковые - они не должны требоваться и если они опущены, разумное значение по умолчанию должно быть доступным. Поэтому исходный сценарий, которым Вы так или иначе недовольны, может на самом деле быть лучшее решение.
Что-то вроде этого:
#!/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"