BASH脚本差异生成升级热更新包

来源:互联网 发布:我的世界手机版火车js 编辑:程序博客网 时间:2024/05/29 00:33

这几天系统学习了Bash的语法,想着写点什么加深一下记忆,曾经用C++实现过差异生成升级热更新包,其实里面大量使用了Shell命令,何不重写一个?近几天发现自己已经一年多不曾更新CSDN博客啦,我一直认为这是一个好习惯,我要继续下去。写这篇文章的前因已经交待清楚,那么就开始本文的主要内容吧。

这里直接贴源码,然后关键的地方我会作注解

#! /bin/bashtraverse() {for item in $1/*; doif [ -d $item ]; then#echo $item "is dir"traverse $itemelif [ -f $item ]; then#echo $item "is file"md5 -r $item >> $md5filefidone}#check argsif [ $# != 1 ]; thenecho "Usage: $0 version"exitfi#check md5 filemd5file="publish/$1.md5"if [ -f $md5file ]; thenecho "version" $1 "exists"read -p "clear it? [Y/n]" chif [ "$(echo $ch | tr '[a-z]' '[A-Z]' | cut -c 1)" == "Y" ]; thenrm -rf publish/$1*elseexitfifi#log versionecho $1 > project/versiontraverse projectcat $md5file | while read line; domd5=${line:0:32}name=${line:33}#diff versionfor (( i=0; i<$1; i++ )); dopath=${name/#project/publish\/${1}\/${i}_to_${1}}path=${path%/*}if [ ! -d $path ]; thenmkdir -p $pathfiif [ "$(cat publish/$i.md5 | grep $name | awk '{ print $1 }')" != "$md5" ]; thencp $name $pathfidonedone#zipfor (( i=0; i<$1; i++ )); dozip -jqr publish/${1}/${i}_to_${1} publish/${1}/${i}_to_${1}/*done

16-19 检查参数

22-31 检查该版本是否生成过(检查md5文件是否存在),若存在提醒用户是否删除相关文件重新生成

34 生成版本文件,主要目的是为了防止空热更新包的存在,举例说明:初始0版本,1版本中增加文件,2版本正好删除1版本中所增加的文件,如此以来,更新包0_to_2应该是没有内容,由于zip命令不能压缩空包,会报错,zip error: Nothing to do!,所以我就增加了每个版本都会被脚本修改的版本文件。(关于不能压缩空包,或许是我没有找到正确姿势,高手看到,望告知)

36 遍历项目,生成md5文件,递归遍历的方法也是我百度出来的,md5命令 -r 选项是为了格式化输出,便于下面使用该md5文件,请参考man md5

38-55 循环以行读文件,分割md5值和文件名称,比对往期版本该文件是否被修改,若修改则拷贝至相应目录,拷贝之前需要先创建目标文件夹,mkdir命令 -p 选项是为了创建中间目录,譬如创建 /home/panshiqu/image 将会连同 panshiqu 目录一起创建。

58-60 zip压缩不同版本之间的升级热更新包,这里特别说 -j 选项,只存储名字要保存的文件,忽略路径,和文件夹名,关于这个选项你可以自行尝试一下,更多请参考man zip

26 用户输入小写转大写,截取第一个字符,是否是 Y

51 读取往期版本md5文件,查找记录着指定文件名称的行,awk分割取记录md5值,与当前版本文件md5值进行比较

关于以上两点,比较部分我加了双引号,若不加解析Bash语法就会出错,这应该是像我这样的新手经常会犯的错误啦

我认为该脚本有两点可以改进的地方

1.其实我应该统一创建目标目录结构,方便拷贝修改文件,因为我在循环内部每次判断该目录是否存在,若不存在就创建,这样同一个目录是会被判断多次的,想知道为什么这样你大可以bash -x hot.sh调试感受一下。

2.我同样也认为每次读往期版本md5文件,查找然后比较是一个高消耗的操作,作为学习的产物,暂时就这样吧。


====本文内容已完,宣传我的项目====

欢迎关注《休闲益智游戏》微信服务号

www.iplaygame.com.cn

谢谢

0 0
原创粉丝点击