2014-09-21 66 views
1

我的getopts函数正常工作时出现问题。应该发生的是,如果没有给出任何补偿,那么一切都是默认的。我有四个选项,如下所示:getopts可选,没有可选参数

-b需要两个2048或4096的其中一个值的其他用法。

-c需要路径的其他用法值。

-p需要路径,否则使用

-h这的确需要即使它确实忽略该值的价值。

但是,如果我放弃选项,它不会让我继续。所以,我需要能够把0到4

msg="" 
nginx_ssl_conf=/etc/nginx/nginx-ssl.conf 
BIT_SIZE=2048 
isHardened=false 
hardened_ciphers="'ECDH+AESGCM256:DH+AESGCM256:ECDH+AES256:SH+AES256:RSA+AESGCM256:RSA+AES256:!aNULL:!MD5:!kEDH';" 
DHEC_path=$STORAGE_ROOT/ssl/dhparam.pem 


# Usage info 
usage() { 
cat << EOF 
Usage: ${0##*/} [-h] [-p DIR_DHEC_KEY] [-b BIT_SIZE] [-c DIR_NGINX_SSL]... 
This script generates and enables DHEC for Nginx. Defaulted to 2048 key. 
Hardened mode will generate 4096 key and the following cipher suites: 
'ECDH+AESGCM256:DH+AESGCM256:ECDH+AES256:SH+AES256:RSA+AESGCM256:RSA+AES256:!aNULL:!MD5:!kEDH' 

    -h   Enable hardened ciphers and 4096 bit key. 
    -p   Specify dir to generate the DHEC key. 
    -c   Specify dir nginx ssl conf is. 
    -b   Specify the bit size to generate. 
EOF 
exit 1 
} 


while getopts "::b:h:::p::c" opt ; do 
    case "${opt}" in 
     b) 
      BIT_SIZE=${OPTARG} 
      if [ -z "${b}"]; then 
       usage 
      fi 
      ;; 
     h) 
      isHardened=true 
      BIT_SIZE=4096 
      ;; 
    p) 
      DHEC_path=${OPTARG} 
      ;; 
     c) 
      nginx_ssl_conf=${OPTARG} 
      ;; 

     *) 
      usage 
      ;; 
    esac 
done 
shift $((OPTIND-1)) 
+0

bash'getopts'不会执行可选参数,据我所知。请参阅http://mywiki.wooledge.org/BashFAQ/035(以及链接的getopts教程),以获取处理参数的各种方法。 – 2014-09-21 01:22:13

回答

0

变化你有这样的:

while getopts "hb:c:p:" opt ; do 
    case "${opt}" in 
     b) 
      BIT_SIZE=${OPTARG} 
      if [ -z "${BIT_SIZE}" ]; then 
       usage 
      fi 
      ;; 

注意,我改变了getopts说法,固定${b}无效的变量,并添加必要的b)案例中]之前的空格。

这应该让你更接近。我不是100%我遵循你的用例,我的理解我认为我可能会采取不同的方式。例如,正如您现在编写的那样,-b 2048 -h会产生与您和用户预期不同的BIT_SIZE。 (与-h -b 2048比较它,看看我的意思是:参数顺序不应该与标志没关系,通常情况下)

编辑
要使用如果给-b位值,否则使用-h位值,如果给定的,否则使用默认值,我会做出的相关更改是:

DEFAULT_BIT_SIZE=2048 
isHardened="false" 

while getopts "hb:c:p:" opt ; do 
    case "${opt}" in 
     b) 
      BIT_SIZE=${OPTARG} 
      if [ -z "${BIT_SIZE}" ]; then 
       usage 
      fi 
      ;; 
     h) 
      isHardened="true" 
      ;; 
    esac 
done 
shift $((OPTIND-1)) 

if [ -z "${BIT_SIZE}" -a "true" == "${isHardened}" ]; then 
    BIT_SIZE=4096 
elif [ -z "${BIT_SIZE}" ]; then 
    BIT_SIZE=$DEFAULT_BIT_SIZE 
fi 
+0

我希望-b覆盖任何默认设置。因此,如果用户使用-h,则默认使用4096,使用-b,然后使用-b。你会怎么做? – user3590149 2014-09-21 01:25:35

+0

如果使用的是需要值的三个参数是-b -p -c,否则使用并退出 – user3590149 2014-09-21 01:30:45

+0

好的,我的编辑中的框架代码应该会得到你想要的。加回你的'p','c'和'*'的情况下,应该这样做。 – bishop 2014-09-21 01:36:27