Как обеспечить использование только одного флага в сценарии оболочки? - PullRequest
1 голос
/ 05 февраля 2020

В настоящее время у меня есть скрипт, который использует короткие флаги -M, -m и -b. Я хочу использовать только один аргумент, поэтому я просто разбил его на соответствующий флаг. Я хотел бы изменить его так, чтобы он возвращал ненулевой код, если используется более одного флага, и я хотел бы поддерживать длинные флаги (--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

1 Ответ

4 голосов
/ 05 февраля 2020

Возможно:

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
...