溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-04 19:05:47 來(lái)源:ITPUB博客 閱讀:158 作者:jeanron100 欄目:MySQL數(shù)據(jù)庫(kù)

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

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

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è)開始做腳本的模塊化整理,是一個(gè)半自動(dòng)的過程,然后發(fā)現(xiàn)了一些問題,非常糾結(jié)的去修復(fù)歷史部署問題,等到第三個(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)好一些,但是問題還是沒有解決,因?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ú)序的,但是執(zhí)行的時(shí)候是希望按照順序,比如步驟2是依賴于步驟1的,這個(gè)我們是明確的。如果要實(shí)現(xiàn)這樣一個(gè)需求,就需要額外的一些補(bǔ)充,那就是排序功能,或者是前端傳入的時(shí)候來(lái)控制更好。

沒事,能者多勞,我們就先實(shí)現(xiàn)了。保證能正確的運(yùn)行起來(lá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

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI