我想比较两个文件,看看它们在我的shell脚本中是否相同,我的方法是:
diff_output=`diff ${dest_file} ${source_file}`
if [ some_other_condition -o ${diff_output} -o some_other_condition2 ]
then
....
fi
基本上,如果它们是相同的,$ {diff_output}应该不包含任何东西,上面的测试将评估为真。
但是,当我运行我的脚本时,它说了 [:参数太多了
在if [....]行。
有什么想法吗?
答案 0 :(得分:15)
您是否关心实际差异,或者文件是否不同?如果是后者,则不需要解析输出;你可以改为检查退出代码。
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 :(得分:1)
正是为此提供了一个选项:-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
,您可以看到它无法正常工作。
答案 2 :(得分:1)
差异用于逐行比较文件 以处理差异工具,例如补丁。如果您只想检查它们是否不同,则应使用 cmp :
cmp --quiet $source_file $dest_file || echo Different
答案 3 :(得分:1)
diff $FILE $FILE2
if [ $? = 0 ]; then
echo “TWO FILES ARE SAME”
else
echo “TWO FILES ARE SOMEWHAT DIFFERENT”
fi
答案 4 :(得分:0)
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)