Я пишу простой сценарий 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" bob@bob.com <./alertfoo
fi
Очевидно, это не проверяет пустое содержимое. Есть мысли о том, как это сделать?
Вы можете использовать тестовые -s
оператор, чтобы проверить, пуст ли файл, и cmp
как правило, самый простой способ проверить файлы на равенство (обратите внимание, что вы можете использовать команду непосредственно в if
как более простую альтернативу сравнению его статуса выхода с 0). Я сохраню бит, в котором вы сортируете два файла перед их сравнением; если в этом нет необходимости, просто используйте два файла напрямую как аргументы для cmp
.
if [ -s ./foo1 ] && ! cmp -q <(sort ./foo1) <(sort ./foo2); then
...
Вы можете прочитать это как: "если ./foo1 не пуст ([ -s ... ]
) И (&&
) отсортированные формы ./foo1 и ./foo2 НЕ являются (!
) тот же самый (cmp
) ".
Вы можете использовать -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