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
Другие вопросы по тегам