BASH - getopts无法正常工作

时间:2014-05-21 07:30:11

标签: bash shell 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 个答案:

答案 0 :(得分:1)

按照您在命令行中指定的顺序处理选项。因此,在您的示例中,首先处理case a),然后立即调用add_vhost函数。

d)案例尚未处理,因此您尚未设置domain

您需要稍微改变一下逻辑。不是直接从case语句中调用函数,而是保存选择的操作。即:

 a)   action="add_vhost"
      ;;

然后在案例之后,检查您是否选择了action,并调用该功能。

答案 1 :(得分:0)

根据您的脚本,您希望在选项-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