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

kiayqfof  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(208)

在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
dgiusagp

dgiusagp1#

只需检查差异。

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

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

if cmp -s s1 d2 ; then ...
irlmq6kh

irlmq6kh2#

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

a=$(cat a)
if [ "$a" = "" ]; then

1.变量与文件不同,因此必须读取所创建文件的输出。
1.可能包含空格的变量在用作参数时必须用引号引起来,并且字符串必须与空值而不是0进行比较。
(As注解中建议,如果不需要diff输出,可以使用退出代码。)

whlutmcx

whlutmcx3#

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

在你甚至开始考虑哪个比较工具,检查他们的文件大小通过stat命令.
如果连这些都不匹配,那么从统计学上讲,任何哈希算法都几乎不可能报告匹配哈希。
我自己使用的一种方法是
1.检查文件大小
1.对于匹配的,在xxhash上对它们进行高速批处理运行。
1.最后,***仅***对于步骤2中建议的副本,通过加密可接受的散列(如SHA3系列中的KeccakShake)再次运行它们,以确认它们确实是副本,排除所有合理怀疑

awk有一个有用的特性,如果你只有一个END块,但是没有从文件或管道中读入任何东西,那么它就有NR = 0
通过利用0th-power of any base,还可以在不使用三元运算符… ? … : …的情况下对两种情况重用相同的字符串。
如果你没有太多的文件,这里有一个蛮力,但高速的方式来做这一切一次。

--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

相关问题