¿Cómo puedo comprobar si hay una coincidencia de cadena Y un archivo vacío en la misma declaración del script bash if/then?

¿Cómo puedo comprobar si hay una coincidencia de cadena Y un archivo vacío en la misma declaración del script bash if/then?

Estoy escribiendo un script bash simple para hacer lo siguiente:

1) Verifique dos archivos (foo1 y foo2).

2) Si foo1 es diferente de foo2 y foo1 NO está en blanco, envíe un correo electrónico.

3) Si foo1 es igual que foo2... o foo1 está en blanco... no hagas nada.

La condición en blanco es lo que me confunde. Esto es lo que tengo para empezar:

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

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

fi

Obviamente, esto no busca contenidos en blanco. ¿Alguna idea sobre cómo hacer eso?

Respuesta1

Puede usar el -soperador de la prueba para verificar si el archivo está vacío y, cmpgeneralmente, es la forma más sencilla de verificar la igualdad de los archivos (tenga en cuenta que puede usar un comando directamente en una ifdeclaración como una alternativa más simple a comparar su estado de salida con 0). Me quedo con la parte en la que ordenas los dos archivos antes de compararlos; si eso no es necesario, simplemente use los dos archivos directamente como argumentos para cmp.

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

Puede leer lo anterior como: "si ./foo1 no está vacío ( [ -s ... ]) Y ( &&) las formas ordenadas de ./foo1 y ./foo2 NO son ( !) iguales ( cmp)".

Respuesta2

Puedes usar -s para comprobar si un archivo está vacío:

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

Si desea saber si una cadena está vacía o no, use la opción -z para verificar si está vacía:

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

o -n para comprobar si no está vacío:

STRING=""
if [[ -z "$STRING" ]]; then
    echo "String is empty"
fi

información relacionada