Processamento da opção Bash Shell Script: Adicione -all e -q (silencioso), Enforce No Repetition

0

Eu estou escrevendo um script Bash que aceita N opções. Chame-os de -1, -2, ..., -N. O seguinte se aplica ao uso das opções:

  • Qualquer número de opções pode ser fornecido, de 0 - N
  • Nenhuma opção aceita argumentos
  • As opções podem ser fornecidas em qualquer ordem

Procuro isso de maneira bastante padronizada:

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

OBJETIVO 1

Gostaria de adicionar duas opções adicionais:

  • -all Isto implica todos os -1, -2, ... -N
  • -q Isso denota o modo "silencioso", ou seja, não imprime nada para a exibição

Se aparecer -all , ele deve aparecer sozinho ou apenas com -q .

-q pode ser usado com as formas de invocação " -all " ou "-1 -2 ... -N".

OBJETIVO 2

Eu gostaria de reforçar que nenhuma opção pode ser repetida.

PERGUNTA

Estou com dificuldades para expandir minha lógica para atingir minhas metas.

Gostaria de perguntar à comunidade: Como posso alcançar essas metas?

Por favor, note que a meta 2 é secundária. Se alguém tiver uma solução para a meta 1, mas não para a meta 2, por favor, forneça-a!

Editado para adicionar: eu posso forçar a lógica brutalmente; o que eu quero dizer é que estou procurando uma solução limpa e elegante que não envolva repetição repetida desnecessária sobre as opções, que forneça a inclusão automática do processamento de novas opções individuais em todos, etc ...

    
por Dave 28.02.2018 / 14:07

1 resposta

0

Acho que isso pode funcionar (não testei).

# 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..
    
por 28.02.2018 / 15:34