【问题标题】:getopts optional and no optional argumentsgetopts 可选且无可选参数
【发布时间】:2014-09-21 10:28:46
【问题描述】:

我的 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))

【问题讨论】:

  • bash getopts 据我所知不做可选参数。有关处理参数的各种方法,请参阅 mywiki.wooledge.org/BashFAQ/035(以及链接的 getopts 教程)。

标签: bash command-line-arguments getopts


【解决方案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

【讨论】:

  • 我希望 -b 覆盖任何默认设置。因此,如果用户使用默认为 4096 的 -h 并且使用 -b 则无论 -b 是什么。您将如何处理?
  • 三个参数如果使用需要一个值是 -b -p -c 否则使用并退出
  • 好吧,我编辑的框架代码应该可以得到你想要的。重新添加您的 pc* 案例,这样就可以了。
  • 谢谢,我认为这涵盖了大多数情况。谢谢!我放了一个完整的脚本用于代码审查。如果你想看看。 codereview.stackexchange.com/questions/63456/…
  • 我不建议这样使用 falsetrue 内置函数。没有理由这样做,并且对于看到未引用的变量并且不了解正在发生的事情的人来说,破坏脚本太容易了。
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 2012-10-14
  • 2018-01-25
  • 2019-05-09
  • 2014-01-24
  • 2016-04-08
  • 2013-09-03
相关资源
最近更新 更多