getopts是可选的,没有可选参数

时间:2014-09-21 00:45:17

标签: bash command-line-arguments 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))

1 个答案:

答案 0 :(得分:1)

改变你拥有的东西:

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