检查脚本中的diff退出状态

gno*_*ule 1 unix linux bash exit-code

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

echo $?   
Run Code Online (Sandbox Code Playgroud)

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

echo "` diff $F1 $F2`"   
rv=$?  
if [[ $rv == 1 ]]  
then    
    echo "failed"    
fi        
Run Code Online (Sandbox Code Playgroud)

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

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

这是在Ubuntu 12.04下.

And*_*ico 5

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

diff $F1 $F2
rv=$?  
if [[ $rv == 1 ]]  
then    
    echo "failed"    
fi
Run Code Online (Sandbox Code Playgroud)

另请注意,diff错误时返回大于 1 的值(0表示相同的文件,1表示不同的文件)。您可能需要检查并处理这种情况。

  • `echo "\`cmd\`"` 结构毫无意义。您正在捕获 `cmd` 写入 `stdout` 的内容,然后......立即将其写入 `stdout`。正如所写的那样,它什么也没做(除了 - 正如你所发现的 - 无法获得 `cmd` 的返回值)。 (2认同)

Red*_*edX 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
Run Code Online (Sandbox Code Playgroud)

  • @gnometorule:如果用'grep -c'^ [0-9]'`替换`wc -l`,你将获得实际的_difference count_. (2认同)