如何在 shell 脚本中强制只使用一个标志?

How to enforce only the use of one flag in a shell script?

我目前有一个使用短标记 -M-m-b 的脚本。我只想使用一个参数,所以我只是让它在匹配标志上中断。我想更改它,以便它 returns 如果使用多个标志,则为非零代码,并且我想支持长标志(--major--minor--bug).如何修改我现在使用的这段代码来实现?

while getopts ":Mmb" increment; do
  case "${increment}" in
    M)
      result=1
      break
      ;;
    m)
      result=2
      break
      ;;
    b)
      result=3
      break
      ;;
  esac
done

也许:

has_M=0
has_m=0
has_b=0

while getopts ":Mmb" increment; do
  case "${increment}" in
    M) has_M=1 ;;
    m) has_m=1 ;;
    b) has_b=1 ;;
  esac
done
shift $((OPTIND - 1))

if (( has_M + has_m + has_b > 1 )); then
    echo "only one of -M -m -b is allowed" >&2
    exit 1
fi

if ((has_M)); then
    :# do -M stuff
elif ((has_m)); then
    :# do -m stuff
elif ((has_b)); then
    :# do -b stuff
fi