
Я пишу простой 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