0

我想在 bash 脚本(Linux)中检查两个文件是否相同。我使用以下代码:

#!/bin/bash
… 
…
differ=$(diff $FILENAME.out_ok $FILENAME.out)
echo "******************"
echo $differ
echo "******************"
if [ $differ=="" ]
  then
   echo "pass"
 else
 echo "Error ! different output"  
 echo $differ   
 fi

问题:

  • diff 命令返回空格并中断 if 命令

输出

 ******************
 82c82 < ---------------------- --- > ---------------------
 ******************
 ./test.sh: line 32: [: too many arguments
 Error ! different output
4

3 回答 3

3

检查两个文件是否相同的正确工具是cmp.

if cmp -s $FILENAME.out_ok $FILENAME.out
then : They are the same
else : They are different
fi

或者,在这种情况下:

if cmp -s $FILENAME.out_ok $FILENAME.out
then
    echo "pass"
else
    echo "Error ! different output"
    diff $FILENAME.out_ok $FILENAME.out
fi

如果您想使用该diff程序,请双引号您的变量(并在命令的参数周围使用空格[):

if [ -z "$differ" ]
then
    echo "pass"
else
    echo "Error ! different output"  
    echo "$differ"   
fi

请注意,您需要在回显变量时将其双引号,以确保在输出中保留换行符等;如果你不这样做,所有的东西都会被塞进一行

或者使用[[测试:

if [[ "$differ" == "" ]]
then
    echo "pass"
else
    echo "Error ! different output"  
    echo "$differ"   
fi

在这里,条件中的变量周围的引号并不是绝对必要的,但是像我这样的老派 shell 脚本编写者会自动且无害地将它们放在那里。粗略地说,如果变量可能包含空格并且空格很重要,则应该用双引号引起来。[[当它也适用于双引号时,我认为不需要学习该命令的特殊情况。

于 2013-08-18T14:04:19.853 回答
2

代替:

if [ $differ=="" ]

采用:

if [[ $differ == "" ]]

最好使用现代[[]]不是外部程序/bin/[

也用于diff -b比较 2 个文件,同时忽略空格

于 2013-08-18T13:47:04.633 回答
1

@anubhava 答案是正确的,你也可以使用

if [ "$differ" == "" ]
于 2013-08-18T14:07:00.867 回答