shell定義shell百度百科是這樣解釋的:shell俗稱殼(用來(lái)區(qū)別于核),,是指“為使用者提供操作界面”的軟件(命令解析器)。它類似于DOS下的command.com和后來(lái)的cmd.exe,。它接收用戶命令,,然后調(diào)用相應(yīng)的應(yīng)用程序。 基本上shell分為兩大類: (1)圖形界面shell(Graphical User Interface shell 即 GUI shell) 例如:應(yīng)用最為廣泛的Windows Explorer(微軟的Windows系列操作系統(tǒng)),,還有也包括廣為人知的Linux shell,,其中l(wèi)inux shell包括 X window manager,以及功能更強(qiáng)大的CDE,、GNOME,、KDE、XFCE,。 (2)命令式shell(Command Line Interface shell,,即 CLI shell) 例如:bash/sh/ksh/csh(Unix/Linux 系統(tǒng)) 示例:shell腳本連接mongodb數(shù)據(jù)庫(kù)并對(duì)數(shù)據(jù)進(jìn)行處理(1)連接mongodb數(shù)據(jù)庫(kù)? 沒(méi)有開(kāi)啟mongodb數(shù)據(jù)庫(kù)驗(yàn)證:mongo ip/數(shù)據(jù)庫(kù) 例如:mongo 192.168.208.1:27017/joe ? 開(kāi)啟了數(shù)據(jù)庫(kù)驗(yàn)證:mongo -u root -p root --authenticationDatabase admin 192.168.208.1/joe (2)直接先來(lái)一個(gè)例子#!/bin/bash #執(zhí)行的命令 #nohup /home/myshell/hello.sh > /home/myshell/logs/addData.log 2>&1 & #死循環(huán) while true do #每天一點(diǎn)至二點(diǎn)之間執(zhí)行 nowhour=`date '+%H'` if [ $nowhour == '01' ];then #獲取當(dāng)前日期和具體的時(shí)間 nowdate=`date -d 'now' +%Y%m%d` nowtime=`date -d 'now' +%Y%m%d\ %H:%M:%S` #時(shí)間格式注意:必須加上\,不然會(huì)報(bào)錯(cuò) #獲取當(dāng)前時(shí)間的秒數(shù) nowSecond=`date +%s -d 'now'` echo $nowtime"-----生成數(shù)據(jù)開(kāi)始-----" #獲取昨天的日期 dayago=`date -d 'yesterday' +%Y%m%d` #對(duì)日期加上單引號(hào) yesterday=`(echo $dayago|sed "s/\w\+/'&'/g")` now=`(echo $nowdate|sed "s/\w\+/'&'/g")` #輸出看看加上引號(hào)沒(méi)有 echo $yesterday #連接mongodb數(shù)據(jù)庫(kù) mongo 192.168.248.129:27017/joe --eval " db.user.insert({ \"name\":\"kobe\", \"sex\":\"男\(zhòng)", \"age\":39 }); db.nba.insert({ \"name\":\"kobe\", \"sex\":\"男\(zhòng)", \"age\":39, \"optDate\":$now });" nowtim=`date -d 'now' +%Y%m%d\ %H:%M:%S` nowSeconds=`date +%s -d 'now'` times=$(($nowSeconds-$nowSecond)) #休眠時(shí)間=一個(gè)小時(shí)減去腳本所消費(fèi)的時(shí)間 t=$((3600-$times)) echo $nowtim"-----生成數(shù)據(jù)結(jié)束-----" sleep $t else sleep 1h fi done #給用戶文件夾的操作權(quán)限:chown -R Joe /home/myshell #給文件可執(zhí)行權(quán)限:chmod +x /home/myshell/addData.sh #vim 文件名 使用命令 :set ff? 可查看格式是dos還是unix 使用命令 :set ff=unix 可以將dos格式轉(zhuǎn)換為unix格式 #--eval "" 冒號(hào)里面的內(nèi)容是不能加上注釋的,,不然會(huì)報(bào)錯(cuò) 項(xiàng)目要求是對(duì)mongodb中的數(shù)據(jù)進(jìn)行處理后再將處理后的數(shù)據(jù)插入數(shù)據(jù)庫(kù),,這樣避免查詢的時(shí)候?qū)?shù)據(jù)進(jìn)行處理,加快查詢速度,,由于公司的賬號(hào)不是root權(quán)限,所以不能通過(guò)crontab定時(shí)任務(wù)去做,,所以只能在后臺(tái)啟動(dòng)一個(gè)線程一直循環(huán)運(yùn)行,,到達(dá)時(shí)間點(diǎn)后,再執(zhí)行,,我設(shè)定的時(shí)間是在凌晨一點(diǎn)到兩點(diǎn)之間,。 說(shuō)說(shuō)上面的shell經(jīng)常踩的坑(LZ也是含著眼淚踩過(guò)來(lái)的,畢竟第一次寫(xiě)): (1)寫(xiě)好shell后,,如果你不是root賬號(hào)登錄,,需要給你使用的用戶授權(quán)文件夾的操作你才能對(duì)其傳文件:chown -R Joe /home/myshell (2)給寫(xiě)好的shell可執(zhí)行權(quán)限:chmod +x /home/myshell/addData.sh (3)執(zhí)行后如果報(bào)錯(cuò):bad interpreter: No such file or directory。多半的原因是因?yàn)槟愕膕hell文檔的格式不對(duì),。(LZ是在Windows上的notepad++里面編寫(xiě)的shell,,就會(huì)導(dǎo)致這個(gè)問(wèn)題,當(dāng)然你也可以通過(guò)notepad++來(lái)修改shell的格式和編碼),,這里介紹linux里的操作方法: ? 首先使用vi 或者 vim 打開(kāi)shell ? 然后使用命令 :set ff? (查看當(dāng)前shell的格式是dos還是unix) ? 如果是dos格式,,使用命令 :set ff=unix,,可以將shell格式修改為unix格式。 (4)nowtime=`date -d 'now' +%Y%m%d\ %H:%M:%S`,,獲取時(shí)間包括時(shí)分秒的時(shí)候,,必須加上 \ 防止將空格轉(zhuǎn)義導(dǎo)致報(bào)錯(cuò)。 (5)dayago=`date -d 'yesterday' +%Y%m%d`,,獲取時(shí)間的時(shí)候+后面不能有空格,,必須連著寫(xiě),而且等號(hào)后面不能有空格,,LZ不會(huì)告訴你就因?yàn)檫@個(gè)搞了我半個(gè)小時(shí),。 (6)now=`(echo $nowdate|sed "s/\w\+/'&'/g")`,(因?yàn)長(zhǎng)Z需要先查詢出數(shù)據(jù),,然后處理后再寫(xiě)入處理好的數(shù)據(jù),,與上述例子無(wú)關(guān)),由于時(shí)間格式是String不是Date,,所以需要將Date加上單引號(hào),,千萬(wàn)別寫(xiě)錯(cuò)。 (7)nohup /home/myshell/addData.sh > /home/myshell/logs/addData.log 2>&1 &,,這個(gè)命令的意思:后臺(tái)執(zhí)行addData.sh,,并將log寫(xiě)到addData.log文件中,2>&1表示:執(zhí)行正確的信息和錯(cuò)誤的信息都寫(xiě)到addData.log中,。 (8)--eval " ":(這個(gè)命令還不是很懂,,留著以后搞懂后再來(lái)更新),還是有注意點(diǎn): ? --eval必須跟在連接數(shù)據(jù)庫(kù)之后(即:數(shù)據(jù)庫(kù)連接 (空格) --eval " "),; ? 引號(hào)里面的內(nèi)容不能有注釋也就是 #..... ?引號(hào)里面的內(nèi)容有特殊字符需要保留的需要在前面加上\,,防止轉(zhuǎn)義(\"name\":\"kobe\") ?引號(hào)里面可以連續(xù)寫(xiě)幾個(gè)不同的數(shù)據(jù)庫(kù)操作,需要使用分號(hào)(;)隔開(kāi) ? 引號(hào)里面不可以使用shell的命令,,比如 echo '-----開(kāi)始-------',,運(yùn)行時(shí)會(huì)報(bào)錯(cuò) (9)if [ $nowhour == '01' ],if后必須有空格,,[ ] 左右也必須有空格,。 (10)再介紹幾種shell中加上引號(hào)或者替換空格的方法: ? 給屬性加上引號(hào) ret=`(echo a b c d|sed "s/\w\+/'&'/g")` echo $ret 輸出 'a' 'b' 'c' 'd' ? 將空格替換為逗號(hào) ret=`(echo a b c d|sed 's/\s\+/,/g')`
echo $ret
輸出 a,b,c,d ? 將空格替換為逗號(hào)的同時(shí)給屬性加上單引號(hào): ret=`(echo a b c d|sed 's/\s\+/,/g')|sed "s/\w\+/'&'/g"` echo $ret 輸出'a','b','c','d' |
|
來(lái)自: hongjing_z > 《mongo》