Обрабатывать опцию Bash getopts с помощью одной из других опций

Мой текущий скрипт Bash выглядит следующим образом. Пока работает кроме варианта -g. Я бы хотел, чтобы этот параметр был необязательным, но его нельзя использовать без -c или -n.

Итак, что я имею в виду:

  • -g должно быть совершенно необязательным
  • Однако, если он задан, то также должны присутствовать -c или -n.

К сожалению, я понятия не имею, как это сделать.

while getopts ':cniahg:' opt; do
  case $opt in
  g) DAYS_GRACE_PERIOD=$OPTARG ;;
  c) prune_containers ;;
  i) prune_images ;;
  n) prune_networks ;;
  a)
    prune_containers
    prune_networks
    prune_images
    ;;
  :) echo "Invalid option: $OPTARG requires an argument" 1>&2 ;;
  h) print_usage ;;
  \?) print_usage ;;
  *) print_usage ;;
  esac
done
shift $((OPTIND - 1))

person Robert Strauch    schedule 15.11.2019    source источник


Ответы (1)


Параметр -g является необязательным, но его нельзя использовать без каких-либо параметров -c или -n.

Сохранить в одной переменной, что использовалась опция c, а в другой переменной — что использовалась опция n, а в другой — что опция g. После разбора вариантов проверьте условие с помощью переменных.

g_used=false c_used=false n_used=false
while .....
   g) g_used=true; ...
   c) c_used=true; ...
   n) n_used=true; ...
....

# something like that
if "$g_used"; then
    if ! "$c_used" || ! "$n_used"; then
      echo "ERROR: -g option was used, but -c or -n option was not used"
    fi
fi

# ex. move the execution of actions after the option parsing
if "$c_used"; then
    prune_containers
fi
if "$n_used"; then
    prune_networks
fi

Похоже, ваш цикл выполняет действие с аргументами разбора. В вашем цикле параметров синтаксического анализа вы можете просто установить переменные, связанные с каждым параметром, а затем после цикла выполнить действия в зависимости от «состояния всех параметров». После цикла, потому что тогда у вас будет «глобальное» представление всех используемых параметров, поэтому анализ и принятие решений на основе нескольких флагов будет проще.

person KamilCuk    schedule 15.11.2019