在实际开发中,版本上线是一个简单,但是非常重要的事,在正规的上线活动中,上线都是要提供上线脚本的,每次上线,都要写上线备份脚本,更新脚本,回退脚本,下面的脚本是根据更新文件列表,自动生成文件备份,更新,回退脚本,分享给大家
更新文件列表
[/home/gfront/ncup/package]$cat up.lst
/home/gfront/ncup/bin/SwtEMU /appsw/gfront/ncup/bin/SwtEMU
/home/gfront/ncup/lib/libDbs.so /appsw/gfront/ncup/lib/libDbs.so
生成脚本的脚本
#/bin/ksh
fun_echo () {
cnt=1
unset str
while [ $cnt -lt `echo "$1" | wc -c` ]
do
str=$str~
cnt=`expr $cnt + 1`
done
echo $str
echo "$1"
cnt=1
unset str
while [ $cnt -lt `echo "$1" | wc -c` ]
do
str=$str~
cnt=`expr $cnt + 1`
done
echo $str
}
fun_usage () {
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "Purpose"
echo " The update shell generating tools"
echo
echo "Syntax"
echo " package listfile"
echo
echo "Listfile Format"
echo " sourpath/sourfile [destpath/destfile]"
echo " sourdir: The source path"
echo " destdir: The destinate path"
echo " sourfile: The source file"
echo " destfile: The destnate file"
echo
echo "PS"
echo " The [destpath/destfile] can be omitted."
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
}
fun_fun_echo2file () {
echo "fun_echo () {" >>$1
echo " cnt=1" >>$1
echo " unset str" >>$1
echo " while [ \$cnt -lt \`echo \"\$1\" | wc -c\` ]" >>$1
echo " do" >>$1
echo " str=\$str~" >>$1
echo " cnt=\`expr \$cnt + 1\`" >>$1
echo " done" >>$1
echo " echo \$str" >>$1
echo "" >>$1
echo " echo \"\$1\"" >>$1
echo "" >>$1
echo " cnt=1" >>$1
echo " unset str" >>$1
echo " while [ \$cnt -lt \`echo \"\$1\" | wc -c\` ]" >>$1
echo " do" >>$1
echo " str=\$str~" >>$1
echo " cnt=\`expr \$cnt + 1\`" >>$1
echo " done" >>$1
echo " echo \$str" >>$1
echo "}" >>$1
}
fun_echo2file () {
echo "$2" >> $1
}
################################### main logic ##############################################################
if [ $# != 1 ]
then
fun_usage
exit 1;
fi
FILELIST=$1
STAMP=`date +%Y%m%d%H%M%S`
WORKDIR=`whoami`_updatepackage_${STAMP}
mkdir $WORKDIR ${WORKDIR}/UPDATE
BACKUPSH=${WORKDIR}/backup\.sh
BACKUPSHHEAD=${BACKUPSH}\.head
BACKUPSHBODY=${BACKUPSH}\.body
BACKUPSHTAIL=${BACKUPSH}\.tail
touch ${BACKUPSHHEAD} ${BACKUPSHBODY} ${BACKUPSHTAIL}
UPDATESH=${WORKDIR}/update\.sh
UPDATESHHEAD=${UPDATESH}\.head
UPDATESHBODY=${UPDATESH}\.body
UPDATESHTAIL=${UPDATESH}\.tail
touch ${UPDATESHHEAD} ${UPDATESHBODY} ${UPDATESHTAIL}
ROLLBACKSH=${WORKDIR}/rollback\.sh
ROLLBACKSHHEAD=${ROLLBACKSH}\.head
ROLLBACKSHBODY=${ROLLBACKSH}\.body
ROLLBACKSHTAIL=${ROLLBACKSH}\.tail
touch ${ROLLBACKSHHEAD} ${ROLLBACKSHBODY} ${ROLLBACKSHTAIL}
#backup
fun_echo2file ${BACKUPSHHEAD} "#!/bin/sh"
fun_echo2file ${BACKUPSHHEAD} ""
fun_fun_echo2file ${BACKUPSHHEAD}
fun_echo2file ${BACKUPSHHEAD} ""
fun_echo2file ${BACKUPSHHEAD} "if [ -f ROLLBACK.OK ];then"
fun_echo2file ${BACKUPSHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $ROLLBACKSH`\`\""
fun_echo2file ${BACKUPSHHEAD} " exit 0"
fun_echo2file ${BACKUPSHHEAD} "fi"
fun_echo2file ${BACKUPSHHEAD} ""
fun_echo2file ${BACKUPSHHEAD} "if [ -f UPDATE.OK ];then"
fun_echo2file ${BACKUPSHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $UPDATESH`\`\""
fun_echo2file ${BACKUPSHHEAD} " exit 0"
fun_echo2file ${BACKUPSHHEAD} "fi"
fun_echo2file ${BACKUPSHHEAD} ""
fun_echo2file ${BACKUPSHHEAD} "if [ -f BACKUP.OK ];then"
fun_echo2file ${BACKUPSHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $BACKUPSH`\`\""
fun_echo2file ${BACKUPSHHEAD} " exit 0"
fun_echo2file ${BACKUPSHHEAD} "fi"
fun_echo2file ${BACKUPSHHEAD} ""
fun_echo2file ${BACKUPSHHEAD} "mkdir BACKUP"
fun_echo2file ${BACKUPSHHEAD} ""
#update
fun_echo2file ${UPDATESHHEAD} "#!/bin/sh"
fun_echo2file ${UPDATESHHEAD} ""
fun_fun_echo2file ${UPDATESHHEAD}
fun_echo2file ${UPDATESHHEAD} ""
fun_echo2file ${UPDATESHHEAD} "if [ ! -f BACKUP.OK ];then"
fun_echo2file ${UPDATESHHEAD} " fun_echo \"\`printf \\\"please run SHELL[ %s ],first!!!\\\n\\\" `basename $BACKUPSH`\`\""
fun_echo2file ${UPDATESHHEAD} " exit 0"
fun_echo2file ${UPDATESHHEAD} "fi"
fun_echo2file ${UPDATESHHEAD} ""
fun_echo2file ${UPDATESHHEAD} "if [ -f ROLLBACK.OK ];then"
fun_echo2file ${UPDATESHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $ROLLBACKSH`\`\""
fun_echo2file ${UPDATESHHEAD} " exit 0"
fun_echo2file ${UPDATESHHEAD} "fi"
fun_echo2file ${UPDATESHHEAD} ""
fun_echo2file ${UPDATESHHEAD} "if [ -f UPDATE.OK ];then"
fun_echo2file ${UPDATESHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $UPDATESH`\`\""
fun_echo2file ${UPDATESHHEAD} " exit 0"
fun_echo2file ${UPDATESHHEAD} "fi"
fun_echo2file ${UPDATESHHEAD} ""
#rollback
fun_echo2file ${ROLLBACKSHHEAD} "#!/bin/sh"
fun_fun_echo2file ${ROLLBACKSHHEAD}
fun_echo2file ${ROLLBACKSHHEAD} ""
fun_echo2file ${ROLLBACKSHHEAD} "if [ ! -f UPDATE.OK ];then"
fun_echo2file ${ROLLBACKSHHEAD} " fun_echo \"\`printf \\\"Didn't run SHELL[ %s ], not need to rollback!!!\\\n\\\" `basename $UPDATESH`\`\""
fun_echo2file ${ROLLBACKSHHEAD} " exit 0"
fun_echo2file ${ROLLBACKSHHEAD} "fi"
fun_echo2file ${ROLLBACKSHHEAD} ""
fun_echo2file ${ROLLBACKSHHEAD} "if [ -f ROLLBACK.OK ];then"
fun_echo2file ${ROLLBACKSHHEAD} " fun_echo \"\`printf \\\"SHELL[ %s ] is be runned,couldn't run again!!!\\\n\\\" `basename $ROLLBACKSH`\`\""
fun_echo2file ${ROLLBACKSHHEAD} " exit 0"
fun_echo2file ${ROLLBACKSHHEAD} "fi"
fun_echo2file ${ROLLBACKSHHEAD} ""
cat $FILELIST | grep -v "^ *#" | sed 's/^ *//g' | sed 's/ *$//g' | while read SOUR DEST
do
if [ "$SOUR" = "" ]
then
continue;
fi
SOURDIR=`dirname $SOUR`
SOURFILE=`basename $SOUR`
if [ "$DEST" = "" ]
then
DESTDIR=$SOURDIR
DESTFILE=$SOURFILE
else
DESTDIR=`dirname $DEST`
DESTFILE=`basename $DEST`
fi
#echo SOURDIR[$SOURDIR] SOURFILE[$SOURFILE] DESTDIR[$DESTDIR] DESTFILE[$DESTFILE]
if [ -f ${SOURDIR}/${SOURFILE} ];then
cp ${SOURDIR}/${SOURFILE} $WORKDIR/UPDATE/${DESTFILE}
# backup
fun_echo2file ${BACKUPSHBODY} "if [ -f \"${DESTDIR}/${DESTFILE}\" ];then"
fun_echo2file ${BACKUPSHBODY} " cp \"${DESTDIR}/${DESTFILE}\" \"BACKUP/${DESTFILE}.${STAMP}\""
fun_echo2file ${BACKUPSHBODY} " fun_echo \"\`printf \\\"[ %-40s ] backup to [ %-50s ].\\\n\\\" ${DESTDIR}/${DESTFILE} \\\`pwd\\\`/BACKUP/${DESTFILE}.${STAMP}\`\""
fun_echo2file ${BACKUPSHBODY} "else"
fun_echo2file ${BACKUPSHBODY} " if [ ! -d \"${DESTDIR}\" ];then"
fun_echo2file ${BACKUPSHBODY} " rm -rf BACKUP"
fun_echo2file ${BACKUPSHBODY} " fun_echo \"\`printf \\\"ERROR:[ %s ] is a refresh path, but it not exists, backup failed!!!\\\n\\\" ${DESTDIR}\`\""
fun_echo2file ${BACKUPSHBODY} " exit 0"
fun_echo2file ${BACKUPSHBODY} " fi"
fun_echo2file ${BACKUPSHBODY} " fun_echo \"\`printf \\\"[ %s ] is a new file, no need to bakcup.\\\n\\\" ${DESTDIR}/${DESTFILE}\`\""
fun_echo2file ${BACKUPSHBODY} "fi"
fun_echo2file ${BACKUPSHBODY} ""
# update
fun_echo2file ${UPDATESHBODY} "rm -f ${DESTDIR}/${DESTFILE}"
fun_echo2file ${UPDATESHBODY} "cp \"UPDATE/${DESTFILE}\" \"${DESTDIR}/${DESTFILE}\""
fun_echo2file ${UPDATESHBODY} "fun_echo \"\`printf \\\"[ %-40s ] update complated.\\\n\\\" ${DESTDIR}/${DESTFILE}\`\""
fun_echo2file ${UPDATESHBODY} ""
# rollback
fun_echo2file ${ROLLBACKSHBODY} "rm -f \"${DESTDIR}/${DESTFILE}\""
fun_echo2file ${ROLLBACKSHBODY} "if [ -f \"BACKUP/${DESTFILE}.${STAMP}\" ];then"
fun_echo2file ${ROLLBACKSHBODY} " cp \"BACKUP/${DESTFILE}.${STAMP}\" \"${DESTDIR}/${DESTFILE}\""
fun_echo2file ${ROLLBACKSHBODY} " fun_echo \"\`printf \\\"[ %-40s ] is recoveryed.\\\n\\\" ${DESTDIR}/${DESTFILE}\`\""
fun_echo2file ${ROLLBACKSHBODY} "else"
fun_echo2file ${ROLLBACKSHBODY} " fun_echo \"\`printf \\\"[ %-40s ] is removed.\\\n\\\" ${DESTDIR}/${DESTFILE}\`\""
fun_echo2file ${ROLLBACKSHBODY} "fi"
fun_echo2file ${ROLLBACKSHBODY} ""
fun_echo "`printf \"[ %s ] package complated.\n\" ${SOURDIR}/$SOURFILE`"
else
fun_echo "`printf \"ERROR:DIRECTORY [%-20s] or FILE [ %s ] is not exist!\n\" $SOURDIR $SOURFILE`"
rm -rf $WORKDIR
exit 0
fi
done
fun_echo2file ${BACKUPSHTAIL} "touch BACKUP.OK"
fun_echo2file ${UPDATESHTAIL} "touch UPDATE.OK"
fun_echo2file ${ROLLBACKSHTAIL} "touch ROLLBACK.OK"
cat ${BACKUPSHHEAD} ${BACKUPSHBODY} ${BACKUPSHTAIL} > ${BACKUPSH}
cat ${UPDATESHHEAD} ${UPDATESHBODY} ${UPDATESHTAIL} > ${UPDATESH}
cat ${ROLLBACKSHHEAD} ${ROLLBACKSHBODY} ${ROLLBACKSHTAIL} > ${ROLLBACKSH}
chmod +x ${BACKUPSH} ${UPDATESH} ${ROLLBACKSH}
rm -f ${BACKUPSHHEAD} ${BACKUPSHBODY} ${BACKUPSHTAIL}
rm -f ${UPDATESHHEAD} ${UPDATESHBODY} ${UPDATESHTAIL}
rm -f ${ROLLBACKSHHEAD} ${ROLLBACKSHBODY} ${ROLLBACKSHTAIL}
tar cvf ${WORKDIR}.tar $WORKDIR 1>/dev/null
compress ${WORKDIR}.tar
rm -rf $WORKDIR
可以使用下面的操作,替换大量的echo,更美观些。
cat <<EOF >file
...
EOF