shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Construção de CASE Complexa


From: Tiago Peczenyj
Subject: Re: [shell-script] Construção de CASE Complexa
Date: Sat, 9 Jul 2016 11:04:04 +0200

EU gosto de separar a logica de compreender as opções (-x --y ) da logica que avalia se elas fazem sentido (opções com valores invalidos, duplicados, etc, e da logica, por fim, que interpreta os mesmos.

Dito isso eu transformaria o switch/case em algo que habilita variaveis/flags.

Depois eu iria validar fora do loop.

Depois eu iria utilizar.

Faço isso pois o script pode evoluir (se tem muita opção, pode ter mais) e para ser facil de testar. E é facil de extrair para um script q servira de base para outros ou incluido via source.

A menos q seja algo trivial como 2 ou 3 opções.

Por fim, invista em uma opcao de help/usage decente. E se vc tem comportamentos default, descreva-os.

Em sábado, 9 de julho de 2016, address@hidden [shell-script] <address@hidden> escreveu:
 

Oi Pessoal,

Boa madrugada! Antes de mais nada, peço desculpas antecipadas caso a lista receba mais de uma mensagem minha sobre o mesmo tema, pois me parece que não está funcionando o envio de mensagens diretamente de minha conta de email e estou re-enviando essa cópia através do painel de controle do Yahoo Groups. Alguém saberia de algum problema, ou bloqueio?


DÚVIDA SOBRE CONDICIONAL DO TIPO CASE


Gostaria de tirar uma dúvida: é possível criar um tipo condicional case
com opções AND e OR misturadas em cada opção de padrão a ser analisado?

Exemplos: eu sei que e possível criar um tipo condicional case básico
como:

case $1 in
  -p)
    echo "Opção 1"
    ;;
  -s)
    echo "Opção 2"
    ;;
  -f)
    echo "Opção 3"
    ;;
   *)
    echo "Modo de uso: nome_do_programa {-spf}"
esac

Neste caso ele analisa o uso do executável com apenas uma opção:

  $ nome_do_programa -p
  Opção 1
  $ nome_do_programa -s
  Opção 2
  $ nome_do_programa -f
  Opção 3

Eu sei que é possível expandir o uso das opções, de cada padrão a ser
analisado, com o OR:

case $1 in
  -p|--project)
    echo "Opção 1"
    ;;
  -s|--subproject)
    echo "Opção 2"
    ;;
  -f|--file)
    echo "Opção 3"
    ;;
   *)
    echo "Modo de uso: nome_do_programa {-spf}"
esac

O que permite ele funcionar para os seguintes casos:

  $ nome_do_programa -p
  Opção 1
  $ nome_do_programa --project
  Opção 1
  $ nome_do_programa -s
  Opção 2
  $ nome_do_programa --subproject
  Opção 2
  $ nome_do_programa -f
  Opção 3
  $ nome_do_programa --file
  Opção 3

E também sei que é possível utilizar AND para evitar (ao máximo) o uso
de condicionais do tipo case aninhadas, como:

case $1:$2:$3 in
  -p:-s:-f)
    echo "Opção 1, 2 e 3 simultâneas"
    ;;
   *)
    echo "Modo de uso: nome_do_programa {-s -p -f}"
esac

que responderia da seguinte maneira:

  $ nome_do_programa -p -s -f
  Opção 1, 2 e 3 simultâneas

Mas não descobri como fazer (se é realmente possível) o uso do AND e do
OR simultâneo em cada opção de padrão a ser analisado pelo tipo
condicional case. É possível criar uma opção de padrão que misture
ambas? Algo como (eu sei que não funciona):

-p|--project:-s|--subproject:-f|--file)

que permitisse gerar resultados como:

  $ nome_do_programa -p -s -f
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa --project -s -f
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa -p --subproject -f
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa -p -s -file
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa --project --subproject -f
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa --project -s --file
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa -p --subproject --file
  Opção 1, 2 e 3 simultâneas
  $ nome_do_programa --project --subproject --file
  Opção 1, 2 e 3 simultâneas

Estou tentando ao máximo obter opções de construção de programas em
shell com o uso do tipo condicional case para não precisar utilizar
(muito) a sua forma aninhada e tentar manter o código o mais "simples"
possível.

Também acredito que posso estar redondamente enganado, e essa linha de
raciocínio pode vir a complicar meu projeto mais à frente. Por isso
qualquer solução alternativa que mude minha linha de desenvolvimento e
torne o programa melhor (e mais legível) também é muito bem vinda.

Desde já agradeço a ajuda.

Saudações.

Rodrigo Amorim




--
Tiago B. Peczenyj

http://about.me/peczenyj


reply via email to

[Prev in Thread] Current Thread [Next in Thread]