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

person sedawkgrep    schedule 21.05.2014    source источник
comment
Пожалуйста, не включайте свой полный код. Вставьте минимальный рабочий пример, показывающий проблему, с которой вы столкнулись. На самом деле, пока вы разбираете свой код, чтобы точно определить реальную проблему, вы можете обнаружить, что можете исправить ошибку самостоятельно. Ознакомьтесь с разделом Прежде чем спрашивать о проблемном коде на странице информации о теге Bash.   -  person gniourf_gniourf    schedule 21.05.2014
comment
Привет @gniourf_gniourf, мой плохой. Я удалю остальные коды.   -  person sedawkgrep    schedule 21.05.2014


Ответы (2)


Параметры обрабатываются в порядке их указания в командной строке. Итак, в вашем примере сначала обрабатывается case a), а затем сразу же вызывается ваша функция add_vhost.

Но случай d) еще не обработан, поэтому вы не установили domain.

Вам нужно немного изменить свою логику. Вместо того, чтобы вызывать ваши функции непосредственно из оператора case, сохраните выбранное действие. то есть:

 a)   action="add_vhost"
      ;;

Затем, после случая, убедитесь, что у вас выбран action, и вызовите эту функцию.

person Mat    schedule 21.05.2014
comment
Привет, @Mat, я последовал твоему совету, но все еще ничего не получил от $domain. Сценарий не повторял google.com. # ./apache_new_vhost.sh -a -d google.com # add_vhost - person sedawkgrep; 21.05.2014
comment
Привет @Mat, мои извинения. Код выше был обновлен. Спасибо! :) - person sedawkgrep; 21.05.2014
comment
Привет, @Mat, да, извини за это. Но возвращаясь, это все еще не работает. :( - person sedawkgrep; 21.05.2014
comment
Ваши параметры getopt неверны. Только d имеет параметр. Попробуйте d:arh. - person Mat; 21.05.2014
comment
Привет @Мэтт, круто! Теперь работает. Спасибо за помощь! Я очень ценю это. :) - person sedawkgrep; 21.05.2014

В соответствии с вашим сценарием вы ожидаете аргумент после опции -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
person Jayesh Bhoi    schedule 21.05.2014
comment
Привет @Jayesh, спасибо за совет. Теперь работает. :) - person sedawkgrep; 21.05.2014