最近上線新功能需要初始化數(shù)據(jù),上線前寫好對(duì)應(yīng)的刷數(shù)據(jù)接口,上線后由于部分?jǐn)?shù)據(jù)錯(cuò)誤導(dǎo)致調(diào)用異常。如果修復(fù)好后,還要再發(fā)布一次解決問題。作為只用一次的代碼,反復(fù)發(fā)布很麻煩。這時(shí),突然想起tombkeer大神微博里分享的PPT,能用工具用工具、能用腳本就不要用編譯語言。因此,現(xiàn)學(xué)現(xiàn)賣一下shell腳本做簡單的數(shù)據(jù)處理。
工作中很少自己寫shell腳本,細(xì)節(jié)比較多,把這次學(xué)習(xí)的成果記下來,供日后查閱。

tombkeeper 大神分享的PPT
#!/bin/bash
#author bollenv@qq.com 2018-02-05
#查詢數(shù)據(jù)庫并將查詢結(jié)果做參數(shù)發(fā)送HTTP請(qǐng)求
#SQL查詢結(jié)果列數(shù)
columnNum=2
#通過參數(shù)行數(shù)和行索引位置
function getValue(){
#調(diào)用方法傳入的第一個(gè)參數(shù),$0 表示方法名
colIndex=$1
#調(diào)用方法傳入的第二個(gè)參數(shù)
rowIndex=$2
#定位到指定行,數(shù)組索引0為第一個(gè)元素
#數(shù)學(xué)算術(shù)運(yùn)算使用 $((a+b))
idx=$(($columnNum*$colIndex+$rowIndex-1))
#判讀索引值是否大于結(jié)果行數(shù)
#${#arrays_name[@]}獲取數(shù)組長度
if [ $idx -le ${#user_attrs[@]} ]; then
echo ${user_attrs[$idx]}
fi
}
#數(shù)據(jù)庫查詢結(jié)果,結(jié)果為每行從左到右每個(gè)單元格為一行(首行為SQL查詢結(jié)果的列名)
#數(shù)組默認(rèn)分割符號(hào)是空格,當(dāng)查詢結(jié)果中包含空格字符時(shí),會(huì)導(dǎo)致一個(gè)字段被分割開,例如:create_time 2017-01-01 12:12:12 會(huì)變成兩條
#2017-01-01
#12:12:12
#因此,IFS=$'\t'采用tab來分割字段的值
#mysql -u 用戶名 -p 密碼 -h 主機(jī)host 數(shù)據(jù)庫名 -e 執(zhí)行腳本內(nèi)容
IFS=$'\t'
user_attrs=(`mysql -udb_user -pdb_pwd -hdb_host dbname -e 'SELECT \`city_name\`,\`name\` FROM t_user"'`)
#循環(huán)遍歷查詢結(jié)果行數(shù)
for (( i=$columnNum; i<=${#user_attrs[@]}; i=i+1))
do
#查詢結(jié)果name為參數(shù)name的值,name為第二列,rowIndex傳入 2
#調(diào)用方法需要用``包上
name=`getValue $i 2`
#查詢結(jié)果city_name為city_name的值,city_name為第一列,rowIndex傳入 1
city_name=`getValue $i 1`
#url中含有大括號(hào)時(shí)需要轉(zhuǎn)義
url="https://api.yourdomain.com/api/register?params=\{\"name\":\"$name\",\"city_name\":\"$city_name\"}"
echo $url
result=$(curl -X GET $url)
echo $result
sleep 0.8
done