4

I've been toying around with makefiles and bash scripts and I'm interested in this:

Is it possible to get a boolean value from a diff(or something similar) so that I can use it in a bash script to evaluate an if statement(so that the user will not see the actual diff executing)?

Gman
  • 41
  • 1
  • 1
  • 2

3 Answers3

10

If all you need is a byte-by-byte comparison, use cmp:

if cmp -s "$a" "$b"; then
    echo Same
else
    echo Differ
fi

This avoids wasting time for diff's difference finding algorithm.

u1686_grawity
  • 426,297
  • 64
  • 894
  • 966
  • It took me a long time to realize that diff and cmp return false if the files differ, true if they are the same. I.e., the semantics are the opposite of what it seems to say. –  Aug 12 '19 at 23:06
5

Yes:

if diff "$file_a" "$file_b" &> /dev/null ; then
    echo "Files are the same"
else
    echo "Files differ"
fi
cYrus
  • 21,379
  • 8
  • 74
  • 79
2

The manual is not clear on the return codes. However, diff should return always 0 when you compare two identical files.

diff -a $file1 $file2 > /dev/null 2>&1

if [ $? -eq 0 ]
then
    ...
fi
ziu
  • 250
  • 1
  • 3
  • 10
  • 1
    "Exit status is 0 if inputs are the same, 1 if different, 2 if trouble." (GNU diffutils 3.2) - Seems fairly clear to me. – u1686_grawity Feb 20 '12 at 23:02
  • diffutils 2.9.19-4065 completely lacks of a "return value" section – ziu Feb 21 '12 at 11:50
  • Be careful ! This construction will fail if `set -e` is active and files differ. Better use `if diff ... ` construction. The `-e` flag ("Exit immediate on error") is handy when all error cases are not yet handled or covered and the script is harmful. – levif Sep 20 '15 at 19:26