數組在以前已經用過介紹,下面介紹其在工做中的一個實際功用web
出現的工做背景:shell
公司測試環境的tomcat的webapps下有3個項目,若是按一般的發佈腳本,須要爲每個項目單獨寫一個發佈腳本,我感受太過麻煩,就想可否用一個腳本搞定這3個項目,最開始是在腳本里面定義三個變量獲取相應的包名,以後對上傳的目錄進行判斷,若該包存在則發佈;雖然實現了,可過程有點繁瑣,並且定義的變量是寫死的,從此如有需求複用的話還須要額外進行修改,非常麻煩,近期在複習數組時忽然想起數組功用,發現使用數組加for循環只須要幾行就解決了問題,並且從此複用不須要對腳本進行修改,只須要替換幾個變量便可。數組
實際的腳本緩存
#!/bin/bash #author by chawan #date 2017/05/18 #要求當前用戶擁有執行該腳本權限,能夠在/etc/sudoers裏面進行設置 #腳本功能:一、先正常關閉tomcat,再查殺pid防止tomcat沒有真正的關閉, 二、若tomcat設置了自動部署則進行if ture過程,若不是,則執行if false過程, 三、查看日誌。 # 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
腳本詳解:tomcat
上面定義了8個變量,1個數組,6個函數實現了根據目錄已有的包,進行發佈;
bash
8個變量:app
分別定義了包存放的文件名、tomcat所在路徑、webapps的路徑、tomcat的PID、時間戳、日誌所在路徑、上傳新包所在路徑,舊包所在路徑。
webapp
1個數組:ide
用於存放上傳新包的包名
函數
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步:
一、遍歷上傳包文件,獲取上傳的包名;
二、將現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
三、將webapps下的與已上傳同名的war包轉移至OLD舊包文件夾內;
四、將上傳的新包複製到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步:
一、遍歷上傳包文件,獲取上傳的包名;
二、爲剛拷貝至OLD舊包文件夾的war包添加時間戳,同時保留原war包以實現備份與回滾;
三、將上傳的新包刪除已便於下次上傳。
autodeploy函數
function autodeploy(){ deploy_cp /etc/init.d/tomcat8080 start deploy_mv }
該函數的做用:實現發佈的核心過程
deploy函數
function deploy(){ clear killtomcat autodeploy taillogs }
該函數做用:實現完整的發佈過程
總結:
上面只是介紹了數組的實際做用,目前工做中因爲我shell腳本寫的並很少,所以對於數組的使用仍是很生澀,上面的例子是思考的結果,寫的雖然顯得很稚嫩,但它畢竟也是通過本身的思考得來。在此寫篇博客記錄一下。大神看看,一笑而過便可,新手們能夠參考,練練數組。