getopts检查互斥参数

Chr*_*now 8 bash getopts

我有一个简单的脚本(下面),它具有互斥的参数.

./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
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 11

我可以想到两种方式:

接受-t <argument>Where参数可以是desktop或的选项minimal

所以你的脚本将被称为:

./scriptname.sh -t desktop -n
Run Code Online (Sandbox Code Playgroud)

要么

./scriptname.sh -t minimal -n
Run Code Online (Sandbox Code Playgroud)

另一种方法是在脚本中强制执行验证,如下所示:

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
Run Code Online (Sandbox Code Playgroud)