检查脚本中的diff退出状态

时间:2014-05-06 14:25:52

标签: linux bash unix exit-code

在命令行上,对两个不同的文件使用diff后,命令

echo $?   

报告' 1'。当我在脚本中尝试相同的操作时,如下所示:

echo "` diff $F1 $F2`"   
rv=$?  
if [[ $rv == 1 ]]  
then    
    echo "failed"    
fi        

然后我从不打印'失败' (即使是不同的文件)。请注意,这是bash shell,因此语法应该没问题(例如,如果我检查' 0'相反,它总是打印)。

如何检查diff命令是否发现差异,并有条件地处理?

这是在Ubuntu 12.04下。

4 个答案:

答案 0 :(得分:5)

来自你的评论:

  

但我想首先打印差异,但也要跟踪有多少比较失败。

我不知道diff是否输出退出代码中的差异数量。我想不是。但是你可以算出这些线......

以下是存储退出代码和计算不同行数的方法

var=$(diff "$F1" "$F2")
#store diff exit code
exit_code=$?
# remember that this is not the same as count of differences
lines_output_by_diff=$(wc -l <<< "$var")

echo "$var"

if (($exit_code == 0)); then
  echo "same"
else
  echo "not same"
fi

答案 1 :(得分:4)

您没有看到diff的返回值,因为上次运行的命令实际上是echo,并且您正在查看其返回值。您应该能够使用以下代码实现所需的效果(捕获然后回显diff的输出是不必要的 - 只需让它写入stdout):

diff $F1 $F2
rv=$?  
if [[ $rv == 1 ]]  
then    
    echo "failed"    
fi

另请注意,diff在出错时返回大于1的值(0表示相同的文件,1表示不同的文件)。您可能想要检查并处理该案例。

答案 2 :(得分:3)

这似乎是因为,在您的脚本中,$?echo行(不是之前的程序)的返回状态,并且echo可能始终有效并返回0

答案 3 :(得分:2)

你可能想要这样做。

echo "`diff $F1 $F2`"
diff $F1 $F2 > /dev/null 2>&1
rv=$?
...

因成功执行$? echo被设置为0。

如果你不想两次运行diff,你也可以这样做..

   diff $F1 $F2 > /tmp/thediff 2>&1
   if [ $? != 0 ]
   then
      cat /tmp/thediff
   fi