
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
-s
Você pode usar o operador de teste para verificar se o arquivo está vazio e cmp
geralmente é a maneira mais simples de verificar a igualdade dos arquivos (observe que você pode usar um comando diretamente em uma if
instruçã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