Como eu simplifico um condicional com múltiplos ou declarações?

3

Estou escrevendo um script de shell que verifica se um parâmetro corresponde a uma string. Existem cerca de 20 deles e mais talvez precisem ser adicionados no futuro.

Atualmente, a forma como eu escrevo é difícil de ler e seria difícil atualizá-lo. Eu não estou muito familiarizado com scripts de shell, então não tenho certeza da melhor maneira de simplificar isso e torná-lo mais fácil de gerenciar.

if [ $4 =="CRITICAL" ] && [[ $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || ]]
  VARIABLE=1
fi

Foo e bar seriam todos strings diferentes no script acima.

    
por Josh 25.01.2018 / 16:11

3 respostas

6
if [[ $4 == CRITICAL && $2 =~ ^(a|b|c|d|e|f|g)$ ]]; then
  VARIABLE=1
fi

BTW, variáveis não citadas e parâmetros posicionais são seguros para uso dentro de [[ ... ]] , mas não em [ ... ] . Em outras palavras, seu [ $4 == "CRITICAL" ] deve ser [ "$4" == "CRITICAL" ] .

Além disso, CRITICAL não precisa ser citado acima. É uma string fixa, sem espaços ou metacaracteres de shell. Se fosse uma string fixa que precisava de cotação por qualquer motivo, é melhor usar aspas simples.

Aspas simples são para strings fixas, aspas duplas são para quando você deseja interpolar variáveis, substituições de comandos, etc. em uma string.

    
por 25.01.2018 / 16:25
8

No shell padrão, você pode usar case , que suporta alternância:

#!/bin/sh
if [ "$4" = CRITICAL ]; then
        case $2 in
        foo|bar|doo|quux)
                VARIABLE=1
                ;;
        esac
fi

Se gastar cinco linhas no case for muito detalhado, escreva em uma delas:

 case $2 in foo|bar|doo|quux) VARIABLE=1;; esac

Observe que == não é padrão em [ .. ] , mas é suportado no Bash e no ksh.

    
por 25.01.2018 / 16:43
-1

Use uma declaração case associada a funções, talvez?

function a_func){ ... }
function b_func(){ ... }

case "${1}" in
  "${4}" == "CRITICAL" && $(echo "${2}" | egrep -n 'a|b|c|d|e|f|g') -gt 0))
    a_func ;;
  *)
    b_func ;;
esac

Enquanto um pseudo código, ele deve orientar o curso

    
por 25.01.2018 / 16:36