shell的引數和指令碼流程改進

jeanron100發表於2018-04-28

今天痛下決心,把事務的工作一定要使用平臺來做,時間短,任務緊,之前的運維開發是鋪了一個面,每個面都做一些相關的事情,所以工作整體看都有進展,但是最後沒有一個專注的功能。

所以我就在想到底是怎麼回事,我能不能專注一些,哪怕就實現一個簡單的功能,把它做好做透,其他的功能是不是能夠同樣複製很多的思想。於是乎,上班後我開始整理自己的思路,一邊問自己,一邊回答,每個回答都對應兩列,一個是需要做的改進(action),還有一個是這個action的預估時間。結果幾分鐘下來,我發現如果理想的情況下,我只需要2個小時就能搞定,這麼一想,還是能接受的,於是對需要做的事情排了一個順序,立馬開幹。

shell的引數和指令碼流程改進

我的設計是使用運維平臺連線中控伺服器來級聯觸發遠端操作,這樣運維平臺對所有環境的耦合性是最低的。

哪怕是最簡陋的操作,也要咬著牙完成,於是大體是這樣的流程,上午的時候有兩個部署需求,下午有兩個,第一個是在半除錯狀態下完成的,第二個開始做指令碼的模組化整理,是一個半自動的過程,然後發現了一些問題,非常糾結的去修復歷史部署問題,等到第三個需求的時候,明顯好了許多,到了第四個,就可以一口氣完成了,流程打通了,細節就可以打磨了。

於是我對有的指令碼的邏輯進行改造,有一個很通用的需求,假設指令碼是initdb.sh要呼叫這個指令碼需要輸入一系列的引數,比如有5個引數。

這個指令碼里面有10個步驟,每個步驟都是使用function來實現的。如果要處理這5個引數,同時能夠控制10個步驟的執行,比如第2步不執行,第3步執行。指令碼中其實還是比較難以管理和實現的。

我設想了幾種實現思路:

1)把10個步驟拆分成10個指令碼,然後每個指令碼都有自己的呼叫方式,獨立控制

2)寫一個配置指令碼,比如main.sh然後在這個指令碼里控制initdb.sh的執行情況

第二種看起來好一些,但是問題還是沒有解決,因為引數怎麼管理,10個步驟怎麼處理還是得細化。

我的初步設想是5個引數,外帶一個引數即可,前面五個引數和一個步驟的引數。

預期執行情況大體如下:

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

init1

init3

init2

即執行的時候是按照init1 init3 init2的方式執行的。

關鍵程式碼如下:

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[*]}"

執行結果如下:

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

test init1

init1

test init3

init3

test init2

init2

這裡有個問題,那就是我們輸入的操作步驟可能是無序的,但是執行的時候是希望按照順序,比如步驟2是依賴於步驟1的,這個我們是明確的。如果要實現這樣一個需求,就需要額外的一些補充,那就是排序功能,或者是前端傳入的時候來控制更好。

沒事,能者多勞,我們就先實現了。保證能正確的執行起來,於是程式碼又開始一通改動。

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[*]}"

假設正確的步驟我們改為了init3 init1 init2,傳入引數為init1 init3 init2,如果能夠轉換,幸福感就大大提高了。

指令碼的執行結果如下:

[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

可見是達到了預期的目標了,所以這個思路可以借鑑,在其他的地方也可以參考使用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2153493/,如需轉載,請註明出處,否則將追究法律責任。

相關文章