Diferença nas condições / teste

1

Digamos que eu tenha que testar se o arquivo contém uma string "mail", qual é a diferença entre

if grep -q "mail" "file"; then ...


if [ $( grep -l "mail" "file") ]; then ...

[ grep -l "mail" "file" ] && ..

Existem diferenças ou são globalizados (como resultariam no mesmo resultado com qualquer condição dentro ou comando)

    
por trolkura 17.03.2016 / 12:00

1 resposta

1

if command; then ...

avalia o status de saída de command . 0 é sucesso (avalia a condição como verdadeira).

Primeiro de tudo: [ é (quase) idêntico a test , portanto, espera que a string command esteja em conformidade com sua sintaxe.

if [ $(command) ]; then ...

avalia a string contendo a saída de command . Na maioria dos casos, não funcionará - veja o exemplo abaixo.

[ command ] && ..

grep -l "mail" "file" será interpretado assim:

  • grep - uma string
  • -l - operador unário retornando o tamanho da string a seguir
  • "mail" - uma string, será passada como um argumento para o operador -l
  • "file" - uma string

Dependendo da implementação, você receberá erros ligeiramente diferentes, porque o acima está pedindo a [ para avaliar uma sequência que consiste em uma string, um número e outra string, sem nenhum operador. Por padrão [ (assim como test ) é um shell embutido, você pode comparar as mensagens de erro com o binário autônomo (geralmente /bin/[ ou /usr/bin/[ ).

    
por 17.03.2016 / 13:03