Назад | Перейти на главную страницу

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

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