您的位置:首页 > 运维架构 > Shell

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

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

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

#! /bin/bash

traverse() {
for item in $1/*; do
if [ -d $item ]; then
#echo $item "is dir"
traverse $item
elif [ -f $item ]; then
#echo $item "is file"
md5 -r $item >> $md5file
fi
done
}

#check args
if [ $# != 1 ]; then
echo "Usage: $0 version"
exit
fi

#check md5 file
md5file="publish/$1.md5"
if [ -f $md5file ]; then
echo "version" $1 "exists"
read -p "clear it? [Y/n]" ch
if [ "$(echo $ch | tr '[a-z]' '[A-Z]' | cut -c 1)" == "Y" ]; then
rm -rf publish/$1*
else
exit
fi
fi

#log version
echo $1 > project/version

traverse project

cat $md5file | while read line; do
md5=${line:0:32}
name=${line:33}

#diff version
for (( i=0; i<$1; i++ )); do
path=${name/#project/publish\/${1}\/${i}_to_${1}}
path=${path%/*}

if [ ! -d $path ]; then
mkdir -p $path
fi

if [ "$(cat publish/$i.md5 | grep $name | awk '{ print $1 }')" != "$md5" ]; then
cp $name $path
fi
done
done

#zip
for (( i=0; i<$1; i++ )); do
zip -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

谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息