Usando a instrução if com ou para validar argumentos para o shell script

1

Estou trabalhando em um script bash para reiniciar várias instâncias do apache em diferentes ambientes. Está funcionando bem, exceto que eu gostaria de adicionar alguma lógica para garantir que apenas os argumentos corretos sejam inseridos. Eu tentei a declaração abaixo de várias maneiras, mas não estou tendo sorte. Alguma sugestão?

if [[ $ENVT != qa || $ENVT != qa2 || $ENVT != stageqa || $ENVT != stage ]];
  then
    usage
fi

É quando eu uso o ambiente de estágio que ele está avaliando a primeira opção e invocando a função em vez de iterar através da vista com o set -x ativado. O script completo pode ser visto em pastebin .

+ ENVT=stage
+ ACTION=stop
+ USER=www
+ '[' 2 -ne 2 ']'
+ [[ stage != qa ]]
+ usage
    
por DFresh 29.07.2014 / 19:54

2 respostas

4

Você não deve usar várias condições if , neste caso, use case :

case "$ENVT" in
  (qa|qa2|stageqa|stage) ;;
  (*) usage ;;
esac
    
por 29.07.2014 / 20:07
1

Eu esperava que o qa, qa2 etc fosse dummy valores para testes mais complexos. Se eles são apenas valores reais , a solução de @Gnouc é muito melhor obviamente.
Deixarei esta resposta aqui para o valor educacional relacionado à sintaxe dos exemplos originais.

Você deseja um "e" para uso com o "!=".

Então, você não deve encadear muitas expressões ou operadores juntos, mas usar testes separados como este (está relacionado com as aspas):

if [[ a1 != b1 ]] && [[ a2 != b2 ]] && [[ a3 != b3 ]] ...

Algo como:

if [[ "$ENVT" != qa ]] && [[ "$ENVT" != qa2 ]] && [[ "$ENVT" != stageqa ]] && [[ "$ENVT" != stage ]];
then
    usage
fi

Eu adicionei aspas em torno das variáveis, como você vê. Isso não é estritamente necessário dentro do double [[]], mas quase em qualquer outro lugar, por exemplo em [], que são muito semelhantes. É difícil se acostumar a sempre citar, então vou manter as citações.

    
por 29.07.2014 / 20:07

Tags