BASH - getopts не работает должным образом
В настоящее время у меня проблемы с моим сценарием. По сути, я хочу, чтобы я выполнял ./apache_new_vhost.sh -a -d google.com
, он создаст файл и каталоги, и если я использую опцию -r, он должен удалить.
Скрипт смог использовать такие функции, как add_vhost. Он может создать конфигурацию и папку, однако имя файла будет пустым, поскольку он не может прочитать значение, которое я передал $domain
,
while getopts ":a:r:d:h" opt; do
case $opt in
a) action=add_vhost
;;
r) action=remove_vhost
;;
d) domain=$OPTARG
;;
h) usage
exit 1
;;
\?) echo "Invalid option: -$OPTARG"
usage
exit 1
;;
:) echo "Error: option -$OPTARG requires an argument."
usage
exit 1
;;
esac
done
#if [ -z $domain ]; then
# usage
# exit 1
if [ $action == "add_vhost" ]; then
echo $action $domain
elif [ $action == "remove_vhost" ]; then
echo $action $domain
fi
2 ответа
Опции обрабатываются в порядке, указанном вами в командной строке. Итак, в вашем примере case a)
обрабатывается первым, и вызывает ваш add_vhost
функционировать прямо тогда.
Но d)
дело еще не было обработано, поэтому вы не установили domain
,
Вам нужно немного изменить свою логику. Вместо вызова ваших функций непосредственно из оператора case сохраните то, какое действие было выбрано. то есть:
a) action="add_vhost"
;;
Затем, после рассмотрения дела, убедитесь, что у вас есть action
выбран, и вызвать эту функцию.
В соответствии с вашим сценарием вы ожидаете аргумент после варианта -a
, Поэтому, когда вы выполняете свой скрипт
./apache_new_vhost.sh -a -d google.com
затем -d
будет считать аргументом, данным -a
вариант. Таким образом, ваш второй аргумент отбрасывается. Чтобы решить его, просто приведите любой аргумент после -a
(например: ./apache_new_vhost.sh -a 1 -d google.com) или внесите изменения в свой getopt
while getopts ":ar:d:h" opt; do