Результат разбора Diff в Shell Script - PullRequest
4 голосов
/ 20 апреля 2010

Я хочу сравнить два файла и посмотреть, являются ли они одинаковыми или нет в моем сценарии оболочки, мой способ:

diff_output=`diff ${dest_file} ${source_file}`

if [ some_other_condition -o ${diff_output} -o some_other_condition2 ]
then
....
fi

В принципе, если они одинаковые, $ {diff_output} не должен содержать ничего, и приведенный выше тест оценивается как true.

Но когда я запускаю свой скрипт, он говорит
[: слишком много аргументов

В строке if [....].

Есть идеи?

Ответы [ 5 ]

15 голосов
/ 20 апреля 2010

Вам небезразлично, каковы фактические различия или просто файлы отличаются? Если это последнее, вам не нужно анализировать вывод; вместо этого вы можете проверить код выхода.

if diff -q "$source_file" "$dest_file" > /dev/null; then
    : # files are the same
else
    : # files are different
fi

Или используйте cmp, что более эффективно:

if cmp -s "$source_file" "$dest_file"; then
    : # files are the same
else
    : # files are different
fi
1 голос
/ 23 апреля 2010
diff $FILE $FILE2
if [ $? = 0 ]; then
echo “TWO FILES ARE SAME”
else
echo “TWO FILES ARE SOMEWHAT DIFFERENT”
fi
1 голос
/ 20 апреля 2010

diff для сравнения файлов строка за строкой для обработки инструмента различий, например patch . Если вы просто хотите проверить, отличаются ли они, вы должны использовать cmp :

cmp --quiet $source_file $dest_file || echo Different
1 голос
/ 20 апреля 2010

Для этого предусмотрена опция: -q (или --quiet). Он сообщает diff просто позволить коду выхода указывать, были ли файлы идентичны. Таким образом, вы можете сделать это:

if diff -q "$dest_file" "$source_file"; then
    # files are identical
else
    # files differ
fi

или если вы хотите поменять местами два пункта:

if ! diff -q "$dest_file" "$source_file"; then
    # files differ
else
    # files are identical
fi

Если вы действительно хотите сделать это по-своему (т. Е. Вам нужен вывод), вы должны сделать это:

if [ -n "$diff_output" -o ... ]; then
    ...
fi

-n означает «проверить, не является ли следующая строка непустой. Вы также должны заключить ее в кавычки, чтобы, если она пустая, в тесте все еще была строка - вы получаете ошибку, потому что ваш тест оценивается как some_other_condition -o -o some_other_condition2, что, как вы видите, не сработает.

0 голосов
/ 20 января 2018

Check files for difference in bash

source_file=abc.txt
dest_file=xyz.txt

if [[ -z $(sdiff -s $dest_file $source_file) ]]; then  

   echo "Files are same"

else

   echo "Files are different"

fi

Code tested on RHEL/CentOS Linux (6.X and 7.X)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...