bash實戰篇-數組在工作中的實際應用(測試環境發布腳本)
數組在之前已經用過介紹,下面介紹其在工作中的一個實際功用
出現的工作背景:
公司測試環境的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實戰篇-數組在工作中的實際應用(測試環境發布腳本)