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
谢谢
- BASH脚本差异生成升级热更新包
- 切合OTA升级的版本升级包自动生成脚本
- Android OTA升级之升级包生成脚本ota_from_target_files
- Lua脚本热更新
- Groovy脚本热更新
- ota升级包中update-script脚本的生成
- ota升级包中update-script脚本的生成
- Android OTA升级包制作脚本详解(四,生成升级脚本updater-script)
- Android OTA升级包制作脚本详解(生成升级脚本updater-script)
- 高效生成差异的脚本
- Unity3D热更新 初识脚本
- 制作升级包脚本
- bash脚本更新dnspod记录
- [Unity热更新]更新lua脚本 (一)
- [Unity热更新]更新lua脚本 (二)
- andfix 增量升级更新 热补丁修复
- andfix 增量升级更新 热补丁修复
- andfix 增量升级更新 热补丁修复
- Java笔记(5)-String、StringBuffer、StringTokenizer、Date、Calendar
- Java中的运行时异常
- iOS 使用NJKWebViewProgress做webview进度条
- 4.Ugly Number II-丑数 II(中等题)
- hdu5900(2016沈阳网络赛1009区间dp)
- BASH脚本差异生成升级热更新包
- 第12章课后第5题答案
- 大二前期工作计划以及近期具体安排
- 如何选择开源许可证
- 逗号运算符
- update
- 文本自适应(sizeToFit)
- 二分排序算法
- Android Audio Effect 机制初探