Como posso verificar se há uma correspondência de string E um arquivo vazio na mesma instrução de script bash if/then?

Como posso verificar se há uma correspondência de string E um arquivo vazio na mesma instrução de script bash if/then?

Estou escrevendo um script bash simples para fazer o seguinte:

1) Verifique dois arquivos (foo1 e foo2).

2) Se foo1 for diferente de foo2 e foo1 NÃO estiver em branco, envie um email.

3) Se foo1 for igual a foo2... ou foo1 estiver 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 conteúdo em branco. Alguma idéia de como fazer isso?

Responder1

-sVocê pode usar o operador de teste para verificar se o arquivo está vazio e cmpgeralmente é a maneira mais simples de verificar a igualdade dos arquivos (observe que você pode usar um comando diretamente em uma ifinstrução como uma alternativa mais simples para comparar seu status de saída com 0). Estou mantendo a parte em que 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 texto acima como: "se ./foo1 não estiver vazio ( [ -s ... ]) E ( &&) as formas classificadas de ./foo1 e ./foo2 NÃO são ( !) iguais ( cmp)".

Responder2

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

informação relacionada