在命令行上,对两个不同的文件使用diff后,命令
echo $?
报告' 1'。当我在脚本中尝试相同的操作时,如下所示:
echo "` diff $F1 $F2`"
rv=$?
if [[ $rv == 1 ]]
then
echo "failed"
fi
然后我从不打印'失败' (即使是不同的文件)。请注意,这是bash shell,因此语法应该没问题(例如,如果我检查' 0'相反,它总是打印)。
如何检查diff命令是否发现差异,并有条件地处理?
这是在Ubuntu 12.04下。
答案 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