Se a declaração der “else” resposta para ambos os resultados do cmp

0

Estou obtendo resultados inesperados dos seguintes itens

COMPARE(){
    if [ ! cmp $IPPATH/ip.old $IPPATH/ip.new >/dev/null 2>&1 ]; then
            echo compare going to create
            CREATE
    else
            echo same
    fi
}

Estou tentando comparar os arquivos, se eles são os mesmos, não faço nada (ou seja, exiba same , mas se eles NÃO forem iguais, exiba compare going to create e, em seguida, execute a função CREATE .

No entanto, recebo o mesmo resultado " same " quando o arquivo é idêntico e quando definitivamente não são o mesmo.

estes são exibidos corretamente (como deveriam):

echo 'cat $IPPATH/ip.old'
echo 'cat $IPPATH/ip.new'
    
por Jim 05.09.2016 / 18:42

1 resposta

6

O caractere [ no seu teste if significa que você disse ao shell para fazer o tipo de avaliação documentada em man test

Pode não corresponder exatamente à página do manual porque [ está embutido na maioria dos shells e ksh , bash , zsh etc pode implementar uma funcionalidade ligeiramente diferente.

No entanto, uma coisa que isso não faz é executar um comando external e testar os resultados.

Então, podemos fazer isso de outra maneira

por exemplo, podemos testar para ver se a saída do comando cmp não está em branco:

if [ -n "$(cmp $IPPATH/ip.old $IPPATH/ip.new)" ]
then
  echo different
else
  echo same
fi

Ou podemos chamar cmp e testar o código de retorno, que está mais próximo de sua intenção original, sem o [...] wrapping:

if ! cmp $IPPATH/ip.old $IPPATH/ip.new > /dev/null 2>&1
then
  echo different
else
  echo same
fi
    
por 05.09.2016 / 19:23