getopts检查互斥参数

14

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

脚本的参数应为./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

有人之前问过这个问题...等一下,我找找...啊,在这里...如何在shell中使用互斥标志——卡在getopts上了? 它甚至在相关问题列表中。你也可以看看在bash shell脚本中使用getopts获取长和短命令行选项。那涵盖了很多领域。 - Jonathan Leffler
我在谷歌上搜索并扫描了推荐的问题,但是我认为这些链接并不相关。希望我的问题标题能够帮助其他像我一样搜索无能的人 :) - Chris Snow
1个回答

17

我能想到两种方式:

1. 接受一个选项,比如-t <argument>,其中argument可以是desktop或者minimal

这样你的脚本将会被调用如下:

./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 - Chris Snow
如果两个选项都不是必须的,但如果使用了其中一个,则应该只使用一个,那么如何调整代码。我的代码类似,但我的变量不是默认为空,而是 dir=pwd,选项 md 将重新定义它。 - Sigur
谢谢您的回答,但是能否进一步解释一下为什么 [ -n "$buildtype" ] 可以验证它们是互斥的? - openCivilisation
1
如果 $buildtype 不为空,则 -n "$buildtype" 将返回成功。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接