Проверка на наличие взаимоисключающих аргументов

У меня есть простой скрипт (ниже), который имеет взаимоисключающие аргументы.

Аргументы для сценария должны быть ./scriptname.sh -m|-d [-n]Однако пользователь может запустить скрипт с ./scriptname.sh -m -d что неправильно.

Вопрос: как я могу обеспечить, чтобы пользователь предоставил только один из взаимоисключающих аргументов?

#!/bin/bash

progname=$0

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

headless='false'
buildtype=''

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

if [ "$buildtype" == "" ];
then
  usage
  exit
fi

1 ответ

Решение

Я могу придумать 2 способа:

Принять вариант как -t <argument> Где аргумент может быть desktop или же minimal

Так что ваш скрипт будет называться как:

./scriptname.sh -t desktop -n

ИЛИ ЖЕ

./scriptname.sh -t minimal -n

Другой альтернативой является принудительная проверка в вашем скрипте:

headless='false'
buildtype=''

while getopts 'mdnh' flag; do
  case "${flag}" in
    m) [[ -n "$buildtype" ]] && usage || buildtype='minimal' ;;
    d) [[ -n "$buildtype" ]] && usage || buildtype='desktop' ;;
    n) headless='true' ;;
    h) usage ;;
    \?) usage ;;
    *) usage ;;
  esac
done
Другие вопросы по тегам