生成脚本的脚本

在实际开发中,版本上线是一个简单,但是非常重要的事,在正规的上线活动中,上线都是要提供上线脚本的,每次上线,都要写上线备份脚本,更新脚本,回退脚本,下面的脚本是根据更新文件列表,自动生成文件备份,更新,回退脚本,分享给大家

更新文件列表

[/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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值