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

这几天系统学习了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文件,查找然后比较是一个高消耗的操作,作为学习的产物,暂时就这样吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值