Я написал сценарий Bash, который принимает N вариантов. Назовите их -1, -2, ..., -N. Следующее относится к использованию опций:

  • Может быть предоставлено любое количество опций, от 0 до N
  • Никакие варианты не принимают никаких аргументов
  • Опции могут быть предоставлены в любом порядке

Я обрабатываю их довольно стандартным способом:

while [[ $# -gt 0 ]]
do
   OPTION="$1"

   case $OPTION in
      -1)
         process_option_1
         shift
         ;;
      -2)
         process_option_2
         shift
         ;;
      ...
      -N)
         process_option_N
         shift
         ;;
      *)
         echo "Unknown option $OPTION. Aborting..."
         exit 1
   esac
done

ЦЕЛЬ 1

Я хотел бы добавить две дополнительные опции:

  • -Все это подразумевает все -1, -2, ... -N
  • -q Это обозначает "тихий" режим, т.е. ничего не печатать на дисплее

Если появляется -all , он должен появиться либо сам по себе, либо только с -q .

-q может использоваться с формами вызова " -all " или "-1 -2 ... -N".

ЦЕЛЬ 2

Я бы хотел, чтобы ни один из вариантов не повторился.

ВОПРОС

Мне трудно расширять свою логику для достижения моих целей.

Я хотел бы спросить сообщество: как я могу достичь этих целей?

Обратите внимание, что цель 2 является вторичной. Если у кого-то есть решение для цели 1, но не для цели 2, обязательно предоставьте его!

Отредактировано, чтобы добавить: я могу грубо заставить логику; я хочу сказать, что я ищу чистое, элегантное решение, которое не включает в себя ненужное повторение циклов по опциям, которое обеспечивает автоматическое включение обработки новых отдельных опций в -all и т. д.

1 ответ1

0

Я думаю, что это может работать (не проверял это).

# Use flags to set options on or off.
opt_1=0
opt_2=0
opt_N=0
opt_q=0
all=0

# Goal 2, make options unique.
set -- $(echo $@|tr ' ' '\n'|sort -u)

# Test for -q option.
if [[ "$@" =~ -q ]]; then
opt_q=1
set -- $(echo ${@/-q/})
fi

# Goal 1, -q already processed if present, see if -all is alone.
if [[ "$@" =~ -all ]] && [ "$#" -ne 1 ]; then
echo -all only by itself or with -q
exit
fi

while [ -n "$1" ]; do
case "$1" in
-1)opt_1=1;;
-2)opt_2=1;;
-N)opt_N=1;;
-all)all=1;;
esac
shift
done

if [ "$opt_q" -eq 1 ]; then
exec 1>/dev/null 2>&1
fi

if [ "$opt_1" -eq 1 ] || [ "$all" -eq 1 ]; then
# do stuff for -1
fi

..etc..

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .