跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 综合服务 > 培训机构 > Linux shell编程学习笔记44:编写一个脚本,将md5sum命令执行结果保存到变量中,进而比较两个文件内容是否相同

Linux shell编程学习笔记44:编写一个脚本,将md5sum命令执行结果保存到变量中,进而比较两个文件内容是否相同

时间:2024-04-05 20:50:31 来源:网络cs 作者:纳雷武 栏目:培训机构 阅读:

标签: 变量  保存  相同  内容  文件  执行  笔记  学习  编写 

0 前言

在 Linux shell编程学习笔记42:md5sumicon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/137125672?spm=1001.2014.3001.5501

中,我们提到编写一个在Linux系统下比较两个文件内容是否相同的脚本。

1 基本思路

基本思路是:

从命令行输入两个文件说明符用md5sum和cut命令获取两个文件的md5校验值比较两个文件的md5校验值如果两个文件的md5校验值相同,说明两个文件内容相同。否则说明两个文件不同。

其中有两个难点:

1.文件的md5值的获取

2.md5值的比较

对于第1个难点,我们的解决办法是:用cut命令从md5sum的执行结果中把md5校验值提取出来。

关于cut命令的用法可以参考:

Linux shell编程学习笔记43:cut命令icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/135730679?spm=1001.2014.3001.5501

对于第2个难点,我们可以把提取出来的md5校验值保存到变量中。

下面我们来研究一下实现的具体办法。

2 创建测试用的文件

2.1 测试文件a.txt

purpleEnduer @ bash \w $ echo -e "no\tname\tmusic\tsport" > a.txt
purpleEnduer @ bash \w $ echo -e "1\taa\t100\t100" >> a.txt
purpleEnduer @ bash \w $ echo -e "2\tbb\t99\t99" >> a.txt
purpleEnduer @ bash \w $ cat a.txt
no      name    music   sport
1       aa      100     100
2       bb      99      99

 

2.2 测试文件b.txt

我们直接用cp命令将a.txt 复制为b.txt

purpleEnduer @ bash \w $ cp a.txt b.txt
purpleEnduer @ bash \w $ cat b.txt
no      name    music   sport
1       aa      100     100
2       bb      99      99

2.3 测试文件 c.txt

purpleEnduer @ bash \w $ echo -e "no\tname\tmusic\tsport" > c.txt
purpleEnduer @ bash \w $ echo -e "3\tcc\t88\t88" >> c.txt
purpleEnduer @ bash \w $ echo -e "4\tdd\t77\t77" >> c.txt
purpleEnduer @ bash \w $ cat c.txt
no      name    music   sport
3       cc      88      88
4       dd      77      77

3 用cut命令从md5sum的执行结果中提取md5校验值

3.1 用md5sum命令计算文件a.txt的md5校验值

purpleEnduer @ bash \w $ md5sum a.txt
80938ffba186be260c0629fed44ff53a  a.txt

 

md5sum命令计算md5校验值后返回信息的格式是:

md5校验值  文件名

第1部分 md5校验值 和  第2部分 文件名之间是用空格分隔的。

3.2 用cut命令和管道提取md5校验值

我们使用cut命令,指定分隔符是空格,并选择第1个字段

purpleEnduer @ bash \w $ md5sum a.txt | cut -d' ' -f1
80938ffba186be260c0629fed44ff53a

这样我们就把文件a.txt的md5校验值提取出来了。

4 将命令执行结果保存到变量中

我们可以使用如下形式的 shell 命令置换特性,将命令的输出存储到变量中:

方法1:

变量名=$(命令 [命令选项 ...] [参数 ...])

方法2:

变量名=`命令 [命令选项 ...] [参数 ...]`

4.1 用第1种方法将 文件a.txt 的md5校验值保存到变量a

 

purpleEnduer @ bash \w $ a=$(md5sum a.txt | cut -d' ' -f1)
purpleEnduer @ bash \w $ echo $a
80938ffba186be260c0629fed44ff53a 

4.2 用第2种方法将 文件c.txt 的md5校验值保存到变量b

purpleEnduer @ bash \w $ b=`md5sum c.txt | cut -d' ' -f1`
purpleEnduer @ bash \w $ echo $b
d22c52262de65e6e5dcb47a389eb04c8

5 编写通过比较md5校验值判断两个文件内容是否相同的脚本

5.1 创建脚本sf.sh 

sf.sh 的内容如下:

# Show program informationecho -e "\n========\nsamefile v 1.0 by PurpleEndurer\n========\n"# Check the number of parametersif [ $# != 2 ]; then  echo -e "The number of parameters is incorrect.\nUsage: samefile file1 file2"else  # Get the md5 checksum of file1  a=$(md5sum $1 | cut -d" " -f1)  if [ ${#a} != 32 ]; then     echo "$1 MD5 checksum error"     return 1  fi  echo "The MD5 checksum of file $1 is:" $a  # Get the md5 checksum of file2  b=`md5sum $2  | cut -d" " -f1`  if [ ${#b} != 32 ]; then     echo "$2 MD5 checksum error"     return 2  fi  echo "The MD5 checksum of file $2 is:" $b  # Check whether two strings are equal  if [ $a = $b ]; then     echo 'These files is same.'  else     echo 'These files is not same.'  fifi

创建命令如下: 

purpleEnduer @ bash ~ $ cp /dev/stdin sf.sh
echo -e "\n========\nsamefile v 1.0 by PurpleEndurer\n========\n"
if [ $# != 2 ]; then
  echo -e "The number of parameters is incorrect.\nUsage: samefile file1 file2"
else
  a=$(md5sum $1 | cut -d" " -f1)
  if [ ${#a} != 32 ]; then
     echo "md5 error"
     exit 1
  fi
  echo "The MD5 of file $1 is:" $a

  b=`md5sum $2  | cut -d" " -f1`
  if [ ${#b} != 32 ]; then
     echo "md5 error"
     exit 2
  fi

  echo "The MD5 of file $2 is:" $b
  if [ $a = $b ]; then
     echo 'These files is same.'
  else
     echo 'These files is not same.'
  fi
fi

purpleEnduer @ bash ~ $ 

由于脚本比较长,所以我们用 cp /dev/stdin sf.sh来创建它。

对这条命令不熟悉的朋友,可以参阅:

Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/133915687

 注意:在输入所有内容后要按Ctrl+D结束。

5.2 比较a.txt 和 b.txt 内容是否相同

purpleEnduer @ bash ~ $ . sf.sh a.txt b.txt

========
samefile v 1.0 by PurpleEndurer
========

The MD5 checksum of file a.txt is: 040da8e416ea8877d9b91959cd986593
The MD5 checksum of file b.txt is: 040da8e416ea8877d9b91959cd986593
These files is same.

purpleEnduer @ bash ~ $ 

文件a.txt 和 b.txt 的 md5校验值相同,所以两个文件内容相同。

5.3 比较a.txt 和 c.txt 内容是否相同

purpleEnduer @ bash ~ $ . sf.sh a.txt c.txt

========
samefile v 1.0 by PurpleEndurer
========

The MD5 of file a.txt is: 040da8e416ea8877d9b91959cd986593
The MD5 of file c.txt is: 30a0ce6033957f499c6f0ac904781fa0
These files is not same.

purpleEnduer @ bash ~ $ 

文件a.txt 和 c.txt 的 md5校验值相同,所以两个文件内容相同。

5.4 比较a.txt 和 不存在文件 x.txt 内容是否相同

purpleEnduer @ bash ~ $ . sf.sh a.txt x.txt

========
samefile v 1.0 by PurpleEndurer
========

The MD5 checksum of file a.txt is: 8b039d79547840fef49dadb7f3853eae
md5sum: x.txt: No such file or directory
x.txt MD5 checksum error
purpleEnduer @ bash ~ $ 

由于第2个文件x.txt并不存在,所以sf.sh会显示出错信息后退出。

5.5 传递参数数量不正确,会给出出错信息和命令正确用法

purpleEnduer @ bash ~ $ . sf.sh

========
samefile v 1.0 by PurpleEndurer
========

The number of parameters is incorrect.
Usage: samefile file1 file2
purpleEnduer @ bash ~ $ . sf.sh a.txt

========
samefile v 1.0 by PurpleEndurer
========

The number of parameters is incorrect.
Usage: samefile file1 file2
purpleEnduer @ bash ~ $ . sf.sh a.txt b.txt c.txt

========
samefile v 1.0 by PurpleEndurer
========

The number of parameters is incorrect.
Usage: samefile file1 file2
purpleEnduer @ bash ~ $ 

 

没有传递参数,只传递了1个参数,或传递了3个参数,都会给出出错信息和命令正确用法。

6 后记

sf.sh算是我写的第1个具有实用价值的脚本,这是开了一个好头,希望后续能够写出更多更好的实用脚本。

本文链接:https://www.kjpai.cn/news/2024-04-05/154602.html,文章来源:网络cs,作者:纳雷武,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论