shell的參數(shù)和腳本流程改進(jìn)

今天痛下決心,把事務(wù)的工作一定要使用平臺(tái)來(lái)做,時(shí)間短,任務(wù)緊,之前的運(yùn)維開(kāi)發(fā)是鋪了一個(gè)面,每個(gè)面都做一些相關(guān)的事情,所以工作整體看都有進(jìn)展,但是最后沒(méi)有一個(gè)專注的功能。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)秭歸免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

所以我就在想到底是怎么回事,我能不能專注一些,哪怕就實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能,把它做好做透,其他的功能是不是能夠同樣復(fù)制很多的思想。于是乎,上班后我開(kāi)始整理自己的思路,一邊問(wèn)自己,一邊回答,每個(gè)回答都對(duì)應(yīng)兩列,一個(gè)是需要做的改進(jìn)(action),還有一個(gè)是這個(gè)action的預(yù)估時(shí)間。結(jié)果幾分鐘下來(lái),我發(fā)現(xiàn)如果理想的情況下,我只需要2個(gè)小時(shí)就能搞定,這么一想,還是能接受的,于是對(duì)需要做的事情排了一個(gè)順序,立馬開(kāi)干。

shell的參數(shù)和腳本流程改進(jìn)

我的設(shè)計(jì)是使用運(yùn)維平臺(tái)連接中控服務(wù)器來(lái)級(jí)聯(lián)觸發(fā)遠(yuǎn)程操作,這樣運(yùn)維平臺(tái)對(duì)所有環(huán)境的耦合性是最低的。

哪怕是最簡(jiǎn)陋的操作,也要咬著牙完成,于是大體是這樣的流程,上午的時(shí)候有兩個(gè)部署需求,下午有兩個(gè),第一個(gè)是在半調(diào)試狀態(tài)下完成的,第二個(gè)開(kāi)始做腳本的模塊化整理,是一個(gè)半自動(dòng)的過(guò)程,然后發(fā)現(xiàn)了一些問(wèn)題,非常糾結(jié)的去修復(fù)歷史部署問(wèn)題,等到第三個(gè)需求的時(shí)候,明顯好了許多,到了第四個(gè),就可以一口氣完成了,流程打通了,細(xì)節(jié)就可以打磨了。

于是我對(duì)有的腳本的邏輯進(jìn)行改造,有一個(gè)很通用的需求,假設(shè)腳本是initdb.sh要調(diào)用這個(gè)腳本需要輸入一系列的參數(shù),比如有5個(gè)參數(shù)。

這個(gè)腳本里面有10個(gè)步驟,每個(gè)步驟都是使用function來(lái)實(shí)現(xiàn)的。如果要處理這5個(gè)參數(shù),同時(shí)能夠控制10個(gè)步驟的執(zhí)行,比如第2步不執(zhí)行,第3步執(zhí)行。腳本中其實(shí)還是比較難以管理和實(shí)現(xiàn)的。

我設(shè)想了幾種實(shí)現(xiàn)思路:

1)把10個(gè)步驟拆分成10個(gè)腳本,然后每個(gè)腳本都有自己的調(diào)用方式,獨(dú)立控制

2)寫一個(gè)配置腳本,比如main.sh然后在這個(gè)腳本里控制initdb.sh的執(zhí)行情況

第二種看起來(lái)好一些,但是問(wèn)題還是沒(méi)有解決,因?yàn)閰?shù)怎么管理,10個(gè)步驟怎么處理還是得細(xì)化。

我的初步設(shè)想是5個(gè)參數(shù),外帶一個(gè)參數(shù)即可,前面五個(gè)參數(shù)和一個(gè)步驟的參數(shù)。

預(yù)期執(zhí)行情況大體如下:

# sh a.sh x x x x x 'init1 init3 init2'

init1

init3

init2

即執(zhí)行的時(shí)候是按照init1 init3 init2的方式執(zhí)行的。

關(guān)鍵代碼如下:

function init1(){

echo 'init1'

}

function init2(){

echo 'init2'

}

function init3(){

echo 'init3'

}

function initdb(){

arr=$1

for fun in ${arr[*]}; do

echo $i

case $fun in

init1)

echo "test init1"

init1

;;

init2)

echo "test init2"

init2

;;

init3)

echo "test init3"

init3

;;

*)

echo "out of scope"

esac

done

}

init_par=$1

actions=($init_par)

initdb "${actions[*]}"

執(zhí)行結(jié)果如下:

[root@dev01 test]# sh a.sh 'init1 init3 init2'

test init1

init1

test init3

init3

test init2

init2

這里有個(gè)問(wèn)題,那就是我們輸入的操作步驟可能是無(wú)序的,但是執(zhí)行的時(shí)候是希望按照順序,比如步驟2是依賴于步驟1的,這個(gè)我們是明確的。如果要實(shí)現(xiàn)這樣一個(gè)需求,就需要額外的一些補(bǔ)充,那就是排序功能,或者是前端傳入的時(shí)候來(lái)控制更好。

沒(méi)事,能者多勞,我們就先實(shí)現(xiàn)了。保證能正確的運(yùn)行起來(lái),于是代碼又開(kāi)始一通改動(dòng)。

function init1(){

echo 'init1'

}

function init2(){

echo 'init2'

}

function init3(){

echo 'init3'

}

function initdb(){

arr=$1

complete_arr=(init3 init1 init2)

order_arr=()

for act_tmp in ${complete_arr[*]}; do

if [[ " ${arr[@]} " =~ " $act_tmp " ]];then

echo $act_tmp

order_arr[${#order_arr[@]}]=$act_tmp

echo order_arr[${#order_arr[@]}]

fi

done

for fun in ${order_arr[*]}; do

echo $i

case $fun in

init1)

echo "test init1"

init1

;;

init2)

echo "test init2"

init2

;;

init3)

echo "test init3"

init3

;;

*)

echo "out of scope"

esac

done

}

init_par=$1

actions=($init_par)

initdb "${actions[*]}"

假設(shè)正確的步驟我們改為了init3 init1 init2,傳入?yún)?shù)為init1 init3 init2,如果能夠轉(zhuǎn)換,幸福感就大大提高了。

腳本的執(zhí)行結(jié)果如下:

[root@dev01 test]# sh aa.sh 'init1 init3 init2'

init3

order_arr[1]

init1

order_arr[2]

init2

order_arr[3]

test init3

init3

test init1

init1

test init2

init2

可見(jiàn)是達(dá)到了預(yù)期的目標(biāo)了,所以這個(gè)思路可以借鑒,在其他的地方也可以參考使用。

新聞標(biāo)題:shell的參數(shù)和腳本流程改進(jìn)
瀏覽路徑:http://muchs.cn/article8/gppgip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司