Shell学习笔记(16)-最后一个练习
来源:互联网 发布:淘宝小号 担保交易 编辑:程序博客网 时间:2024/06/05 22:37
在etl目录下有若干个ktr文件,每个ktr文件中都包含一些dbip,dbsid,username,passwd等配置信息,这个shell的脚本是根据配置文件修改这些ktr文件的配置信息.
配置文件config.txt的设计如下:
server:10.10.224.99:10.10.224.100
database:popdb:lotterydb
username:jdlottery:jdlottery
password:'Encrypted 2be98afc86aa7828bbb15a164ca97bdc4':'Encrypted 2be98afc86aa7828bbb15a164ca97bdc4'
格式采用 元素名:原始值:改之后的值.
其中password的值中含有空格,用' '括起来表示这是一个整体.
shell文件:
#! /bin/bash
#build.sh用于根据config.txt的配置信息更改*.ktr的connection信息,并执行*.ktr完成统计工作
#shopt -s -o nounset
ktrFiles=$(ls *.ktr)
#备份
echo "开始备份...."
[ -d back-up ] || mkdir back-up
timeStamp=_$(date +%Y%m%d_%H%M%S)
for ktrfile in ${ktrFiles}
do
cp ./${ktrfile} ./back-up/${ktrfile}${timeStamp}
done
echo "备份结束"
#参数替换
echo "参数替换...."
declare -i num
declare -i i=1
eval $(wc -l config.txt | awk '{printf("num=%s\n"),$1}')
while((i<=num))
do
eval $(awk -F: 'NR=="'$i'"{printf("para"'$i'"_name=%s\npara"'$i'"_value_old=%s\npara"'$i'"_value_new=%s\n"),$1,$2,$3}' config.txt )
# name=para${i}_name
# echo ${name}:${!name}
# value_old=para${i}_value_old
# echo ${value_old}:${!value_old}
# value_new=para${i}_value_new
# echo ${value_new}:${!value_new}
# eval echo \$$name
let i++
done
replace(){
if [ $# -ne 4 ]; then
echo "使用法: $FUNCNAME 文件名 属性名 原始值 新值"
return 1
fi
[ -a $1 ] || (echo "$1不存在!";return 2)
content_old="<$2>$3</$2>"
content_new="<$2>$4</$2>"
# local -i i=$(sed -n s/${content_old}/p $1 | wc -l)
local -i i=$(cat $1 | grep "${content_old}" | wc -l)
echo "$1存在${content_old}的个数为:$i"
if((i<1));then
echo "$1不存在属性元素:$content_old."
return 3
fi
[ -d tmp ] || mkdir tmp
tmp_file="./tmp/tmp.$$"
sed s#"${content_old}"#"${content_new}"#g $1 > ${tmp_file}
mv -f ${tmp_file} $1
echo "$1文件 原内容$content_old替换成$content_new!"
}
for ktrfile in ${ktrFiles}
do
i=0
while((i<=num))
do
let i++
name=para${i}_name
value_old=para${i}_value_old
value_new=para${i}_value_new
# [ ${!value_old} == ${!value_new} ] && continue || replace ${ktrfile} ${!name} ${!value_old} ${!value_new}
if [ "${!value_old}" == "${!value_new}" ];then
continue
else
replace ${ktrfile} ${!name} "${!value_old}" "${!value_new}"
if [ $? -ne 0 ];then
echo "=======================ERROR!========================"
exit 1;
fi
fi
done
done
echo "替换结束"
1.这个实例中涉及到的最复杂最麻烦的东东就是'和"以及空格、特殊字符等的处理,这个详细参照shell十三问的解答吧。
2.shell变量和sed、awk变量的交互也不是个容易的东东,但原理和'和"的区别是一致的.
3.sed 替换的内容中有特殊内容的问题.如是< > / 空格,最坑爹是替换的内容中含有/s。(</server>中就包含/s)
不过如果你搞明白了shell内容对IFS、单引号、双引号、escape(转义)字符的处理方式,上面三个问题就都不是问题啦。
shell十三问中对单引号和双引号的区别的解释堪称经典中的经典,细细品味吧.
- Shell学习笔记(16)-最后一个练习
- shell去掉最后一个字符
- shell去掉最后一个字符
- shell 脚本练习。笔记
- Hadoop学习笔记之HBase Shell语法练习
- Shell简易学习练习
- shell学习笔记(2) 一个简单的shell脚本程序
- Shell学习笔记(3)-一个复杂一点的Shell程序
- 【shell】用sed获取最后一个字符
- shell去掉字符串最后一个字符
- SHELL显示字符串最后一个字符
- 黑马程序员--学习笔记--一个WinForm简单加法练习程序
- shell 学习笔记 ---一个rename脚本
- shell脚本学习笔记--一个简单的脚本
- Android Animation学习笔记【原帖没有Demo,自己写了一个,链接在最后】
- [Bash Shell] Shell学习笔记
- [Bash Shell] Shell学习笔记
- undo 练习学习笔记。
- 史上最通俗的《深入理解计算机网络》目录
- PHP中使用mkdir创建多级目录的方法
- 改善HTML5 Canvas的性能
- 防止JAVA程序重复启动进程的解决办法
- android 混淆文件project.properties和proguard-project.txt
- Shell学习笔记(16)-最后一个练习
- [Java 常用类库]:StringCompress(字符串压缩)
- Android之Gridview图片列表
- Jsp自定义标签
- 小明的难题
- ArcGIS API for Silverlight应用开发系列(2)客户端读取Shapefile
- myeclipse恢复删除文件
- 未将对象引用设置到对象的实例--可能出现的问题总结
- Protel电路设计中的网络标号、总线与跳线 (转)