Expressões de teste semelhantes usando ou operador?

1

Apenas perguntando se isso:

if [ "$first_arg" == "major" ] || [ "$first_arg" == "minor" ]; then
        exit 1;
fi

é o mesmo que isto:

if [ "$first_arg" == "major" || "$first_arg" == "minor" ]; then
      exit 1;
fi
    
por Alexander Mills 17.06.2018 / 01:06

2 respostas

5

Eles não são iguais. De fato, [ "$first_arg" == "major" || "$first_arg" == "minor" ] não é nem uma expressão válida.

Isso ocorre porque [ é um comando equivalente a test e eles não podem usar a alternativa || , que opera no nível entre os comandos. O que poderia ser historicamente considerado correto para alternativa é -o , mas agora está marcado como obsoleto pelo POSIX 1 , que aconselha a reescrever

test "$1" -o "$2"

em

test "$1" || test "$2"

Além das construções test e [ , há também o comando "moderno" [[ test, que por sua vez não aceita -o , mas aceita || .

Assim, todos são válidos e equivalentes:

  1. Um teste [[ :

    if [[ $first_arg == major || $first_arg == minor ]]; then
        exit 1;
    fi
    
  2. Dois testes [[ :

    if [[ $first_arg == major ]] || [[ $first_arg == minor ]]; then
        exit 1;
    fi
    
  3. Dois testes [ (o equivalente padrão):

    if [ "$first_arg" = major ] || [ "$first_arg" = minor ]; then
        exit 1;
    fi
    

As aspas duplas aroung $first_arg não são necessárias dentro de [[ , pois não há divisão de palavras nem expansão de nome de caminho nele. As aspas devem ser usadas com [ , no entanto. E não faz sentido citar minor nem major . Não apenas aqui, mas com test ou [ também. Isso é porque são cordas simples.

1. Consulte o USO DO APLICATIVO.

    
por 17.06.2018 / 01:35
1

Como ambas as expressões não são válidas, existe uma equivalência quase; -)

Observe que == só é válido com o oparador% padrão[[.

Em geral: ao usar o test construído, recomenda-se usar apenas expressões simples, pois expressões maiores podem resultar em resultados imprevisíveis caso a expansão do parâmetro seja aplicável.

Como o test está embutido no shell desde aprox. 35 anos, chamar comandos mais simples de test e combiná-los no nível do shell não é mais um problema de desempenho.

    
por 17.06.2018 / 13:42