【问题标题】:getopts checking for mutually exclusive argumentsgetopts 检查互斥参数
【发布时间】:2014-03-10 08:57:45
【问题描述】:

我有一个包含互斥参数的简单脚本(如下)。

脚本的参数应该是./scriptname.sh -m|-d [-n],但是用户可以使用./scriptname.sh -m -d 运行脚本,这是错误的。

问题:如何强制用户只提供一个互斥参数?

#!/bin/sh

usage() {
   cat <<EOF
Usage: $0 -m|-d [-n]
where:
    -m create minimal box
    -d create desktop box
    -n perform headless build
EOF
   exit 0
}

headless=
buildtype=

while getopts 'mdnh' flag; do
  case "$flag" in
    m) buildtype='minimal' ;;
    d) buildtype='desktop' ;;
    n) headless=1 ;;
    h) usage ;;
    \?) usage ;;
    *) usage ;;
  esac
done

[ -n "$buildtype" ] && usage

【问题讨论】:

标签: bash getopts


【解决方案1】:

我能想到两种方法:

接受-t &lt;argument&gt; 之类的选项,其中参数可以是desktopminimal

所以你的脚本将被称为:

./scriptname.sh -t desktop -n

./scriptname.sh -t minimal -n

另一种选择是在您的脚本中强制执行验证,如下所示:

headless=
buildtype=

while getopts 'mdnh' flag; do
  case "$flag" in
    m) [ -n "$buildtype" ] && usage || buildtype='minimal' ;;
    d) [ -n "$buildtype" ] && usage || buildtype='desktop' ;;
    n) headless=1 ;;
    h) usage ;;
    \?) usage ;;
    *) usage ;;
  esac
done

【讨论】:

  • 非常感谢!顺便说一句 - 我注意到并修正了问题中的一个错字,buildttype 应该是 buildtype
  • 如果2个选项不是强制性的,如何调整代码,但如果使用,应该只使用一个。我的代码类似,但我的变量默认不是空的,它是 dir=pwd 并且选项 md 将重新定义它。
  • 感谢您的回答,但您能否进一步解释为什么 [ -n "$buildtype" ] 验证这些是互斥的?
  • -n "$buildtype" 将在$buildtype 非空时返回成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2020-07-29
  • 2017-01-03
  • 1970-01-01
  • 2016-02-27
  • 2014-06-19
相关资源
最近更新 更多