Como posso verificar se existe uma correspondência de seqüência de caracteres E um arquivo vazio na mesma instrução de script if / then bash?

3

Estou escrevendo um script simples para fazer o seguinte:

1) Verifique dois arquivos (foo1 e foo2).

2) Se foo1 for diferente de foo2 e foo1 NOT blank, envie um email.

3) Se foo1 é o mesmo que foo2 ... ou foo1 está em branco ... não faça nada.

A condição em branco é o que está me confundindo. Aqui está o que eu tenho para começar:

diff --brief <(sort ./foo1) <(sort ./foo2) >/dev/null
comp_value=$?

if [ $comp_value -ne 0 ]
then
        mail -s "Alert" [email protected] <./alertfoo

fi

Obviamente, isso não verifica se há conteúdo em branco. Alguma idéia de como fazer isso?

    
por Mike B 14.10.2012 / 07:33

2 respostas

4

Você pode usar o operador -s do teste para verificar se o arquivo está vazio e cmp é geralmente a maneira mais simples de verificar a igualdade de arquivos (observe que você pode usar um comando diretamente em uma instrução if como uma alternativa mais simples para comparar seu status de saída com 0). Eu estou mantendo o bit onde você classifica os dois arquivos antes de compará-los; se isso não for necessário, basta usar os dois arquivos diretamente como argumentos para cmp .

if [ -s ./foo1 ] && ! cmp -q <(sort ./foo1) <(sort ./foo2); then
    ...

Você pode ler o acima como: "if ./foo1 não está vazio ( [ -s ... ] ) AND ( && ) os formulários classificados de ./foo1 e ./foo2 NÃO são ( ! ) iguais ( cmp ) ".

    
por 14.10.2012 / 11:35
3

Você pode usar -s para verificar se um arquivo está vazio:

if [[ -s $FILE ]] ; then
echo "$FILE has data."
else
echo "$FILE is empty."
fi

Se você quiser saber se uma string está vazia ou não, use a opção -z para verificar se está vazia:

STRING="test"
if [[ -n "$STRING" ]]; then
    echo "String is not empty"
fi

ou -n para verificar se não está vazio:

STRING=""
if [[ -z "$STRING" ]]; then
    echo "String is empty"
fi
    
por 14.10.2012 / 07:55