2013年以來自己因為偷懶,少寫了很多東西,今年計劃把以前積累的總結出來。先從shell開始寫起吧。幹了快3年游戲運維,期間經常會寫一些shell本,不少腳本其實有很多可以復用的部分。按照自己的風格,如果是比較重要的腳本,腳本內容可以分為3部分:輸入部分、核心邏輯部分、輸出部分。本文主要介紹輸入部分...
2013年以來自己因為偷懶,少寫了很多東西,今年計劃把以前積累的總結出來。
先從shell開始寫起吧。
幹了快3年游戲運維,期間經常會寫一些shell本,不少腳本其實有很多可以復用的部分。
按照自己的風格,如果是比較重要的腳本,腳本內容可以分為3部分:輸入部分、核心邏輯部分、輸出部分。
本文主要介紹輸入部分。
通常在現網運行的腳本,為了防止勿執行,最好帶上參數,例如:
test.sh -w 1
而帶參數的腳本寫法如下,註釋部分按個人風格書寫即可:
#!/bin/bash
# creat by fank 2016-01-01
echo "===`date +"%F %T"`=="
while getopts w: opt;do case $opt in w) w_list=${OPTARG};; ?) usage;; esac done
usage(){
echo "$0 -w [check_list]"
echo "$0 -w \"27-30\""
echo "$0 -w \"2,3,4\""
exit 1
}
echo $w_list
完成了帶參數的輸入,接下來可以進行參數解析或檢查等操作。
實際過程中也經常可能遇到參數擴展的情況,比如輸入-w '1-10',如何在腳本中把這個保存為一個包含1-10的數組呢:
function check_input(){ [[ -z $w_list ]]&& usage w_list=${w_list//-/..} w_tmp="echo {$w_list}" list=$(eval $w_tmp) list=$(echo $list|awk -F'{|}| ' '{for(i=1;i<=NF;i++)print $i }'|xargs) for i in $list;do [[ $((i+0)) != $i ]] && tms_fail "Input worldID must be a number!" done echo "World set list is as follows:" echo $list echo "==" }
在上面的代碼中,對w_list變數(字元串)先進行了一次替換
w_list=${w_list//-/..}
然後利用花括弧擴展產生一個序列保存在新變數中
w_tmp="echo {$w_list}" list=$(eval $w_tmp)
其實這句代碼,對-w '1,2,3' 這種輸入也適用。