Как проверить совпадение строки и пустой файл в одном и том же операторе скрипта bash if/then?

Как проверить совпадение строки и пустой файл в одном и том же операторе скрипта bash if/then?

Я пишу простой bash-скрипт, который делает следующее:

1) Проверьте два файла (foo1 и foo2).

2) Если foo1 отличается от foo2 и foo1 НЕ пустое, отправьте электронное письмо.

3) Если foo1 совпадает с foo2... или foo1 пусто... ничего не делать.

Меня смущает пустое условие. Вот с чего мне нужно начать:

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

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

fi

Очевидно, это не проверяет пустое содержимое. Есть мысли, как это сделать?

решение1

Вы можете использовать оператор теста -s, чтобы проверить, пуст ли файл, и, cmpкак правило, это самый простой способ проверить файлы на равенство (обратите внимание, что вы можете использовать команду непосредственно в операторе ifкак более простую альтернативу сравнению ее статуса выхода с 0). Я оставляю часть, где вы сортируете два файла перед их сравнением; если это не нужно, просто используйте два файла непосредственно в качестве аргументов для cmp.

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

Вышесказанное можно прочитать как: «если ./foo1 не пусто ( [ -s ... ]) И ( &&) отсортированные формы ./foo1 и ./foo2 НЕ ( !) одинаковы ( cmp)».

решение2

Вы можете использовать -s, чтобы проверить, является ли файл пустым:

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

Если вы хотите узнать, является ли строка пустой или нет, используйте опцию -z для проверки на пустоту:

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

или -n для проверки, не пусто ли:

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

Связанный контент