shell中使用列表和字典实现多文件的解压
工作中要根据不同的文件解压到不同的文件夹中,所以写了个脚本处理这些事情
1.准备工作
首先要有一个统一的命名格式,这个是写脚本的前提,不然光是处理一堆稀奇古怪的包名就够你头疼的
命名格式如下:符合类似格式即可
v6.1_aiwobu.zip
v6.2_aiwobu.zip
v6.1_buaini.zip
2.脚本的编写
2.1用到的知识点
- 列表的生成与操作
- 字典的生成与操作
- 函数的传参与返回值
- .其他基础知识:sed,awk等
2.2详细脚本
#!/bin/bash
#用途: 1.根据文件名解压拷贝web文件到指定位置,并更改版本号
# 2.解压服务文件到指定位置
#原理: 1.分别获取版本号,存储在列表中
# 2.将列表生成字典,方便取用
#作者: connor
#时间: xxxx.2.14
#版本: v2
source_dir="/data/source"
web_dir="/data/clusters/release"
api_dir="/data/clusters/api_release"
aiwobu_version=`ls -l ${source_dir}|tail -n +2|grep aiwobu|awk '{print $9}'`
buaini_version=`ls -l ${source_dir}|tail -n +2|grep buaini|awk '{print $9}'`
boom_version=`ls -l ${source_dir}|tail -n +2|grep boom|awk '{print $9}'`
service_version=`ls -l ${source_dir}|tail -n +2|grep service|awk '{print $9}'`
#---------------------------------------获取web版本号并存储到列表当中--------------------------------------
get_version () {
#声明Version_list是一个列表
declare -a Version_list
#列表去重(备份时有用,此处没有多大用,只是生成了一个列表)
for Version_name in ${1}
do
#判断元素是否在数组中
if echo "${Version_list[@]}" | grep "${Version_name:1:3}" &>/dev/null;then
continue
else
#将元素追加到数组中
Version_list=(${Version_list[@]} ${Version_name:1:3});
fi
done
echo ${Version_list[@]}
}
#-----------------------------------解压文件到指定目录&拷贝文件&修改配置文件-----------------------------------------------
unzip_package () {
for version_number in ${Version_dict[${key}]}
do
cd ${source_dir}
package_name="v${version_number}_${key}"
unzip -qo ${package_name}.zip -d ${package_name}
#区分copy时的路径
if [ ${key} == "service" ];then
file_path="${api_dir}/PDW.SCM.API_v${version_number}"
elif [ ${key} == "rom" ];then
file_path="${web_dir}/v${version_number}"
else
file_path="${web_dir}/v${version_number}/${key}"
fi
\cp -r ${package_name}/* ${file_path}
#修改webconfig
if [ ${key} != "service" ];then
#过滤出老的版本号
old_web_version=`grep key=\"Version\" ${file_path}/Web.config |awk -F '"' '{print $4}'`
#过滤出需要更改的版本号
change_web_version=`grep key=\"Version\" ${file_path}/Web.config |awk -F '"' '{print $4}'|awk -F '.' '{print $3}'`
change_web_version=$((change_web_version+1))
new_web_version=${version_number}.${change_web_version}
#修改版本号
sed -i "s/key=\"Version\" value=\"${old_web_version}\"/key=\"Version\" value=\"${new_web_version}\"/g" ${file_path}/Web.config
echo "${key}"
echo "${old_web_version} ==> ${new_web_version}"
fi
done
}
#获取需要发布内容的版本号
service_version_list=`get_version "${service_version}"`
boom_version_list=`get_version "${boom_version}"`
buaini_version_list=`get_version "${buaini_version}"`
aiwobu_version_list=`get_version "${aiwobu_version}"`
#声明Version_dict是一个字典
declare -A Version_dict
Version_dict=(
[service]="${service_version_list}"
[boom]="${boom_version_list}"
[buaini]="${buaini_version_list}"
[aiwobu]="${aiwobu_version_list}"
)
#-----------------------------------------主体逻辑------------------------------------------
for key in $(echo ${!Version_dict[*]})
do
#去除value为空的key
if [ -n "${Version_dict[${key}]}" ];then
if [ ${key} == "service" ];then
unzip_package
elif [ ${key} == "boom" ];then
unzip_package
elif [ ${key} == "buaini" ];then
unzip_package
elif [ ${key} == "aiwobu" ];then
unzip_package
else
continue
fi
fi
done