發(fā)現(xiàn)工作中不記筆記真的不行,shell腳本終于用上已定義的別名了!

1. 新架構使用的mongodb存放日志,技術支持需要獲取唱吧最近幾天的所有轉化日志。由于yoda功能還未開始實現(xiàn),UI沒有搜索mongdb的頁面,所以手動實現(xiàn)。

2. 具體需求如下:唱吧這個產品從18號到24號所有的轉化數(shù)據(jù)。

包括下邊三個活動

campaign_id=2560,campaign_id=2576,campaign_id=2577

3. 轉化日志是按天存放的mongdb集合,技術支持需要三個活動的日志分開存放(否則可以按天遍歷制定集合并使用or條件選擇查詢),所以需要bash里面的雙重for循環(huán):

for id in 2560 2576 2577

do

for day in 18 19 20 21 22 23 24

do

echo mongoexpdays $id conversion 201705""$day >> 2017-05-25_Changba_allConversion.txt

4. 上面的代碼存放在mongo服務器的/home/mongodb目錄下/home/mongolog/20170525/changba。使用時發(fā)現(xiàn)bash腳本怎么不能使用自定義的函數(shù)式的別名(上面的mongoexpdays)!!

5. 工作中沒有時間去研究這個了。所以手動寫了原始的mongexp語句:

#mongoexport -d mclog -c conversion_201705""$day -q "{campaign_id:$id}" -o $id""_conversion_201705""$day""_export.txt

6.真的是感覺不適用別名就無法簡單復用以前的經(jīng)驗!!回到家百度一下加上實驗,果然,shell腳本是在非交互shell執(zhí)行的,當然不會載入alias存放的位置!

果斷在腳本頭里加入如下兩行:

#!/bin/bash --login

#成為login shell,才能讀取.bashrc的Alias設置

shopt -s expand_aliases

#使用shell內置命令shopt命令來開啟alias擴展選項

7. 好了,再次測試,發(fā)現(xiàn)腳本執(zhí)行時爆出了載入alias配置文件的一些信息,比如cygpath不是有效命令 :)

然后就是看到mongoexpdays這個別名被使用了!成功導出數(shù)據(jù)!

8. mongoexpdays定義如下:

alias mongoexpdays='func_export(){ mkdir -m 777 -p /home/mongolog/$(now);cd /home/mongolog/$(now);mongoexport -d mclog -c $2_$3 -q "{campaign_id:$1}" -o $1_$2_$3_export.txt;};func_export $@'

9.提出幾個改進的空間:

a. for循環(huán)的天數(shù)寫法是列舉了所有天數(shù),應該指定范圍更方便。考慮while語句和遞增。

b. mongoexpdays這樣的別名之所以沒有寫成腳本用來調用,主要原因在于腳本一旦多了,管理起來成本高,alias的話,只需要alias|grep -i就能大致查詢到相應的命令。而且腳本的存放和多服務器腳本同步比較麻煩,所以寫在了alias配置文件里,更新維護一個文件就行。

但是這樣,alias的功能在遇到復雜問題就不夠用了,就需要寫出多個alias來,這樣不方便記憶和快速調用alias。

比如用alias寫出來一個service mongodb start/stop/status/restart這樣的功能來就比較麻煩,尤其是需要多個參數(shù)且對參數(shù)加以判斷(shell腳本使用case語句)的時候。

比如跨服務器拷貝文件,我是用scp或者rsync,然后別名都寫了很多,如果是腳本的話可以合并這些別名的,放在case語句就行了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容