1. 程式人生 > >bash實戰篇-數組在工作中的實際應用(測試環境發布腳本)

bash實戰篇-數組在工作中的實際應用(測試環境發布腳本)

數組 腳本 shell

數組在之前已經用過介紹,下面介紹其在工作中的一個實際功用


出現的工作背景

公司測試環境的tomcat的webapps下有3個項目,如果按通常的發布腳本,需要為每一個項目單獨寫一個發布腳本,我感覺太過麻煩,就想能否用一個腳本搞定這3個項目,最開始是在腳本裏面定義三個變量獲取相應的包名,之後對上傳的目錄進行判斷,若該包存在則發布;雖然實現了,可過程有點繁瑣,而且定義的變量是寫死的,今後若有需求復用的話還需要額外進行修改,很是麻煩,近期在復習數組時突然想起數組功用,發現使用數組加for循環只需要幾行就解決了問題,而且今後復用不需要對腳本進行修改,只需要替換幾個變量即可。


實際的腳本

#!/bin/bash
#author by chawan
#date 2017/05/18
#要求當前用戶擁有執行該腳本權限,可以在/etc/sudoers裏面進行設置
#腳本功能:1、先正常關閉tomcat,再查殺pid防止tomcat沒有真正的關閉,
2、若tomcat設置了自動部署則進行if ture過程,若不是,則執行if false過程,
3、查看日誌。
#
NAME=test #取包名
TOMCAT=/tomcat  #tomcat家目錄
WEB=$TOMCAT/webapps     #war包存放目錄
PID=`ps aux|grep -v grep|grep "$TOMCAT\>"|awk ‘{print $2}‘` #取啟動tomcat的PID
DATE=`date +%Y-%m-%d-%H:%M:%S`  #定義時間戳,用於保存舊包
LOGS=$TOMCAT/logs           # 定義日誌目錄
OLD=/opt/old_$NAME          #定義存舊包的目錄變量
WAR=/opt/war_$NAME          #定義存放新包的目錄變量
declare -a war_array       #定義一個數組用於存放WAR路徑下的包名
war_array=($(ls $WAR))
#tomcat的stop函數:停與清緩存
function killtomcat(){
        sh $TOMCAT/bin/shutdown.sh 
                cd $TOMCAT/work/Catalina
                rm -rf localhost && echo "cache is cleaned"
        #  
}
#查看日誌看是否發布成功
function taillogs(){
         tail -f $LOGS/catalina.out #
}
#定義功能函數:自動發布
function autodeploy(){
                deploy_cp
        /etc/init.d/tomcat8080 start
        deploy_mv
}  
#定義功能函數,發布的上半部分,將需要新發的包進行舊包刪除,舊包遷移至OLD目錄,將新包復制到WEB目錄下
function deploy_cp (){
    for ((i=0;i<${#war_array[*]};i++))
    do
        cd $WEB && rm -rf ${war_array[$i]:1:3} && echo "${war_array[$i]} file is deleted"
        mv -f ${war_array[$i]} $OLD &> /dev/null && echo "${war_array[$i]} is moved $OLD"
        cp $WAR/${war_array[$i]} $WEB && echo "${war_array[$i]} package is moved to $WEB"
    done
}
#定義功能函數,發布的下部分,將舊包添加時間戳用於記錄發布的時間,刪除WAR路徑下的新包以便下次的上傳
function deploy_mv (){
    for ((n=0;n<${#war_array[*]};n++))
    do
        cd $OLD && echo "dir change to $OLD"
        cp ${war_array[$n]} ${war_array[$n]}$DATE.war && echo "old ${war_array[$n]} package mv over"
        cd $WAR && rm -f ${war_array[$n]} && echo "In $WAR‘s ${war_array[$n]} is deleted"
    done
}

function deploy(){
clear
killtomcat
autodeploy
taillogs
}
deploy


腳本詳解

上面定義了8個變量1個數組6個函數實現了根據目錄已有的包,進行發布;

8個變量

分別定義了包存放的文件名、tomcat所在路徑、webapps的路徑、tomcat的PID、時間戳、日誌所在路徑、上傳新包所在路徑,舊包所在路徑。


1個數組

用於存放上傳新包的包名


6個函數


killtomcat函數

function killtomcat(){
        sh $TOMCAT/bin/shutdown.sh 
                cd $TOMCAT/work/Catalina
                rm -rf localhost && echo "cache is cleaned"
        #  
}

用於關閉tomcat及清理緩存

taillogs函數

function taillogs(){
         tail -f $LOGS/catalina.out #
}

用於查看發布是否成功

function deploy_cp (){
    for ((i=0;i<${#war_array[*]};i++))
    do
        cd $WEB && rm -rf ${war_array[$i]:1:3} && echo "${war_array[$i]} file is deleted"
        mv -f ${war_array[$i]} $OLD &> /dev/null && echo "${war_array[$i]} is moved $OLD"
        cp $WAR/${war_array[$i]} $WEB && echo "${war_array[$i]} package is moved to $WEB"
    done
}

deploy_cp函數

function deploy_cp (){
    for ((i=0;i<${#war_array[*]};i++))
    do
        cd $WEB && rm -rf ${war_array[$i]:1:3} && echo "${war_array[$i]} file is deleted"
        mv -f ${war_array[$i]} $OLD &> /dev/null && echo "${war_array[$i]} is moved $OLD"
        cp $WAR/${war_array[$i]} $WEB && echo "${war_array[$i]} package is moved to $WEB"
    done
}

此函數主要包含4步:

1、遍歷上傳包文件,獲取上傳的包名;

2、將現webapps下的與已上傳包同名的文件夾刪除;

rm -rf ${war_array[$i]:1:3}

該步驟是刪除與包同名的已解壓的文件夾,假設我的包名是abc.war,

${war_array[$i]}裏面的內容是abc.war,而我想刪除之前已解壓的abc文件夾,通過定義新變量自然可以實現,但數組中有切片的功能,即對數組中的內容進行剪切,於是我們可以通過${war_array[$i]:1:3}實現abc的獲取,具體概念參看之前的數組篇

http://chawan.blog.51cto.com/9179874/1851443

3、將webapps下的與已上傳同名的war包轉移至OLD舊包文件夾內;

4、將上傳的新包復制到webapps路徑下。

deploy_mv函數

function deploy_mv (){
    for ((n=0;n<${#war_array[*]};n++))
    do
        cd $OLD && echo "dir change to $OLD"
        cp ${war_array[$n]} ${war_array[$n]}$DATE.war && echo "old ${war_array[$n]} package mv over"
        cd $WAR && rm -f ${war_array[$n]} && echo "In $WAR‘s ${war_array[$n]} is deleted"
    done
}

此函數主要也包含3步:

1、遍歷上傳包文件,獲取上傳的包名;

2、為剛拷貝至OLD舊包文件夾的war包添加時間戳,同時保留原war包以實現備份與回滾;

3、將上傳的新包刪除已便於下次上傳。

autodeploy函數

function autodeploy(){
                deploy_cp
        /etc/init.d/tomcat8080 start
        deploy_mv
}

該函數的作用:實現發布的核心過程

deploy函數

function deploy(){
clear
killtomcat
autodeploy
taillogs
}

該函數作用:實現完整的發布過程


總結

上面只是介紹了數組的實際作用,目前工作中由於我shell腳本寫的並不多,因此對於數組的使用還是很生澀,上面的例子是思考的結果,寫的雖然顯得很稚嫩,但它畢竟也是經過自己的思考得來。在此寫篇博客記錄一下。大神看看,一笑而過即可,新手們可以參考,練練數組。

本文出自 “張帆-IT的奇幻漂流” 博客,請務必保留此出處http://chawan.blog.51cto.com/9179874/1957162

bash實戰篇-數組在工作中的實際應用(測試環境發布腳本)