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