当前位置: 首页 > 知识库问答 >
问题:

如何在Unix shell脚本中检查diff命令是否成功

钱朝明
2023-03-14

在Unix shell脚本中,我想通过if语句检查diff命令的输出是否等于0。这样我就可以相应地给出if case语句。

例如:Abc.sh

#!/bin/bash
cd users
diff s1 d1 > a.txt
wc -l a.txt | awk '{print f1}' > a
echo "value of a is"
cat a
if [ $a == 0 ]
  then
echo "checksums match"
  else
echo "checksums do not match"
fi

输出:

value of a is
0
[: ==: unary operator expected
checksums do not match

共有3个答案

毕霖
2023-03-14

更新1:关于短路的快速说明

在你开始考虑哪些比较工具之前,请通过stat命令检查它们的文件大小。

如果连这些都不匹配,那么从统计上来说,任何哈希算法都几乎不可能报告匹配的哈希。

我自己使用的一种方法是

  1. 检查文件大小
  2. 对于匹配的,通过xxhash对它们进行高速批量运行。
  3. 最后,仅针对步骤2中建议的重复项,通过加密可接受的哈希再次运行它们,例如KeccakSHA3系列中的Shake,以确认它们是真正的重复项,排除所有合理怀疑

==============================

如果只有一个< code>END块,但没有从文件或管道中读入任何内容,则< code>awk有一个有用的特性,即< code>NR = 0。

还可以在两种情况下重复使用相同的字符串,而无需使用三元运算符 ... ... ... : ...通过利用任何基数的 0 次方

如果你没有太多的文件,这里有一个相当蛮力,但速度很快,可以一次完成。

--just remove the bckgrnd placing bit "... & )"  if u wanna do it sequentially 

|

for f1 in "${m2p}" "${m3l}" "${m3m}";              do 
for f2 in "${m3m}" "${m2a}" "${m2p}" "${m3supp}" ; do 

    ( diff "${f1}" "${f2}" |  

      {m,g}awk -F'^$' -v __="${f1}" -v ___="${f2}" '
      END {
              ____=ENVIRON["HOME"] 
          sub(____,"~",__)
          sub(____,"~",___)
      
          print "checksums for \n\t\42"(__)"\42\n\t\b\b\b\band \42"\
                                       (___)"\42 ===> "   \
          substr(" DO NOT match", ((_+= ++_)^++_+!!_)^!NR)"\n" }' &)
      
done ; done | gcat -b


 1  checksums for 
 2      "~/m2map_main.txt"
 3      and "~/m2map_main.txt" ===> match

 4  checksums for 
 5      "~/m3vid_genie26.txt"
 6      and "~/m3vid_genie26.txt" ===> match

 7  checksums for 
 8      "~/m3vid_genie26.txt"
 9      and "~/m2art_main_03.txt" ===>  DO NOT match

10  checksums for 
11      "~/m3vid_genie26.txt"
12      and "~/m3vid_genie25_supp.txt" ===>  DO NOT match

13  checksums for 
14      "~/m23lyricsFLT_05.txt"
15      and "~/m3vid_genie26.txt" ===>  DO NOT match

16  checksums for 
17      "~/m23lyricsFLT_05.txt"
18      and "~/m2art_main_03.txt" ===>  DO NOT match

19  checksums for 
20      "~/m23lyricsFLT_05.txt"
21      and "~/m3vid_genie25_supp.txt" ===>  DO NOT match

22  checksums for 
23      "~/m3vid_genie26.txt"
24      and "~/m2map_main.txt" ===>  DO NOT match

25  checksums for 
26      "~/m2map_main.txt"
27      and "~/m3vid_genie26.txt" ===>  DO NOT match

28  checksums for 
29      "~/m2map_main.txt"
30      and "~/m2art_main_03.txt" ===>  DO NOT match

31  checksums for 
32      "~/m2map_main.txt"
33      and "~/m3vid_genie25_supp.txt" ===>  DO NOT match

34  checksums for 
35      "~/m23lyricsFLT_05.txt"
36      and "~/m2map_main.txt" ===>  DO NOT match
伍玮
2023-03-14

有很多方法可以修复脚本,但这可能是最简单的:

a=$(cat a)
if [ "$a" = "" ]; then
  1. 变量与文件不同,因此您必须读取所创建文件的输出。
  2. 可能包含空格的变量在用作参数时必须用引号括起来,并且字符串必须与空而不是 0 进行比较。

(正如注释中所建议的,如果您不需要<code>diff</code>输出,您可以使用退出代码。)

夏侯航
2023-03-14

只需检查差异。

if diff s1 d1 ; then
   echo "checksums match"
else
   echo "checksums do not match"
fi

如果您不想在终端上有输出,可以使用cmp

if cmp -s s1 d2 ; then ...
 类似资料:
  • 问题内容: 查找进程aa.sh是否正在运行的linux命令是什么。ps命令似乎不起作用,并且不显示Shell脚本名称。 请指教。 问题答案: 检查一下

  • 问题内容: 我需要这样的东西在PHP: 有什么解决办法吗? 问题答案: 在Linux / Mac OS上,请尝试以下操作: 然后在代码中使用它: 更新: @ camilo-martin建议,您可以简单地使用:

  • 问题内容: 我有一个Node.js脚本所需的脚本,我想保持JavaScript引擎独立。 例如,我只想在Node.js下运行。如何执行此测试? 发布此问题时,我不知道Node.js模块功能是否基于CommonJS。 对于我给出的具体示例,一个更准确的问题是: 脚本如何判断是否已将其作为CommonJS模块使用? 问题答案: 通过寻求CommonJS支持 ,这是Underscore.js库的实现方式

  • 本文向大家介绍如何在Linux中使用diff命令,包括了如何在Linux中使用diff命令的使用技巧和注意事项,需要的朋友参考一下 diff命令逐行分析并显示两个文件之间的更改列表。作为一种特殊情况,diff将标准输入的副本与其自身进行比较。本文介绍“如何在Linux中使用diff命令。 “ diff”命令的期货– 识别一个文件版本之间的更改 比较两个配置或程序文件 创建一个可以与Linux /

  • 问题内容: 好吧,我是SQL的新手,我刚刚读到,存储过程始终返回一个值,确定该过程中的查询是否已成功执行是一种很好的做法。 所以我有一个带有select语句的简单存储过程,如果要执行,我想返回1,否则返回-1。 您能告诉我如何用SQL编写该条件吗? 如果有关系,我的数据库是MS SQL Server。 谢谢你。 问题答案: 使用输出参数返回成功状态以及Try..Catch块

  • 问题内容: 如何检查python脚本中是否存在程序? 假设您要检查或是否可用。我们假设他们应该在路上。 最好看到一个多平台解决方案,但就目前而言,Linux足够了。 提示: 运行命令并检查返回代码并不总是足够的,因为某些工具即使尝试也会返回非0结果。 检查命令时,屏幕上不应显示任何内容 另外,我希望能找到更通用的解决方案,例如 问题答案: import subprocess import os