最近公司有些定時任務(wù)需要在Linux上執(zhí)行,所以隨手寫一些shell腳本處理一下。
#!/bin/sh
. $HOME/./.profile
. $HOME/shell/ini_bat.sh
. $HOME/shell/etl/functions.sh
. $HOME/shell/lingx/shell/zq_init.sh
SQL=/home/yxzcdev/shell/lingx/xuanzhiyong/sql
LOG=/home/yxzcdev/shell/lingx/xuanzhiyong/log
CTL=/home/yxzcdev/shell/lingx/xuanzhiyong/ctl
logfile=$LOG/monitor_output.log
rm -f ${logfile}
dmsp_uid=ydyy
dmsp_pwd=sql
#####################
#上面這一段是配置文件,主要是數(shù)據(jù)庫的一些配置(例如,服務(wù)器IP,端口,賬號密碼,數(shù)據(jù)庫名稱等等),不加的話,也可以自定義
#后面那兩個是為了預(yù)防配置文件里可能不存在這個賬號密碼,所以定義了變量。
#####################
## 判斷是否存在參數(shù)
if [ $# = 0 ]; then
#當(dāng)前日期,如:2019-07-01
lastmonth=`date -d"-1 month" +%Y-%m-01`
#是否周末
week_end=`date '+%w'`
#上上月最后一天,例如:2019-06-30
want_date=`date '+%Y%m%d'`
#month_id=`date -d "-1 day" "+%Y%m"`
elif [ $# = 1 ]; then
#ETL系統(tǒng)傳參,當(dāng)前日期如:2019-08-10
want_date=$1
#month_id=$1
else
echo "[`date +'%Y%m%d %T'`] 腳本傳參不正確,程序退出調(diào)度!"
exit
fi
if [ $week_end -eq 0 ];then
#周末則跑存儲過程,dbisqlc是sybase專用的客戶端程序。
dbisqlc -c "uid=$dmsp_uid;pwd=$dmsp_pwd;eng=$iq_eng;dbn=$iq_dbn;links=tcpip{host=$iq_host;port=$iq_port}" \
-q "call p_lidm_comm_action();commit;call P_yjjk();commit;"&>> ${logfile}
fi
sql_path="/home/yxzcdev/shell/lingx/xuanzhiyong/sql/monitor_weekend.sql"
data_path="/home/yxzcdev/shell/lingx/xuanzhiyong/data/"
#導(dǎo)出數(shù)據(jù)(含5份清單以及一個日期值)
dbisqlc -c "uid=$dmsp_uid;pwd=$dmsp_pwd;eng=$iq_eng;dbn=$iq_dbn;links=tcpip{host=$iq_host;port=$iq_port}" \
-q ${sql_path}&>> ${logfile}
#清單日期
max_date=`cat ${data_path}$'max_date.txt'`
data=("/zengqq/每周四監(jiān)控清單/受理量異常清單" "1.業(yè)務(wù)監(jiān)控統(tǒng)計報表之受理量異常" \
"/zengqq/每周四監(jiān)控清單/受理量異常清單" "2.業(yè)務(wù)監(jiān)控統(tǒng)計報表之撤單" \
"/zengqq/每周四監(jiān)控清單/夜間操作監(jiān)控清單" "3.業(yè)務(wù)監(jiān)控統(tǒng)計報表之夜間監(jiān)控" \
"/zengqq/每周四監(jiān)控清單/受理量異常清單" "4.受理量異常清單" \
"/zengqq/每周四監(jiān)控清單/受理量異常清單" "5.撤單清單" \
"/zengqq/每周四監(jiān)控清單/夜間操作監(jiān)控清單" "夜間操作監(jiān)控清單" \
"/hpfj/業(yè)務(wù)質(zhì)量稽核清單/受理量異常清單" "受理量異常清單(黃埔)" \
"/byfj/業(yè)務(wù)質(zhì)量稽核清單/受理量異常清單" "受理量異常清單(白云)")
len=${#data[@]}
for((i=0;i<len-1;i+=2))
do
#ftp路徑
ftp_path=${data[i]}
#重命名文件
rename_file=${data[i+1]}${max_date}$'.txt'
#源文件
source_file='test'$[i/2]$'.txt'
cd ${data_path}
ftp -n <<- EOF
open 132.97.172.153
user root_yws sdf*()386
cd ${ftp_path}
bin
#刪除已上傳文件。
delete ${rename_file} -f
#復(fù)制源文件
put ${source_file}
#重命名文件
rename ${source_file} ${rename_file}
bye
EOF
#刪除源文件
rm ${source_file} -f
#返回根目錄
cd /
done
其實shell腳本和bat腳本差不多,不過就穩(wěn)定性和查錯情況而言,我覺得shell腳本似乎更勝一籌。對于像我這樣的小白,都可以根據(jù)shell腳本報錯來排查故障。唯一的問題就是,Linux系統(tǒng)對中文的支持不太好。所以即便可以導(dǎo)出中文命名的文件,在傳輸?shù)絎indows服務(wù)器時也會出現(xiàn)無法識別文件名而導(dǎo)致無法傳輸。
所以我還是建議輸出時先導(dǎo)出英文的文件名,傳輸?shù)絎indows服務(wù)器(這里是132.97.172.153,ftp傳輸協(xié)議)后再進行重命名。
原先以為可以用shell腳本讀取數(shù)據(jù)庫客戶端的數(shù)據(jù),結(jié)果報錯,所以后面涉及一些需要從數(shù)據(jù)庫里傳輸變量到shell程序時,都是先導(dǎo)出然后再讀取文件。這里的max_date=`cat ${data_path}$'max_date.txt'`就是使用這個原理。先從數(shù)據(jù)庫里把最新日期導(dǎo)出到max_date.txt,然后用cat函數(shù)讀取這個文件的數(shù)據(jù),賦值給max_date變量。
此外,里面的if函數(shù)也是有意思。結(jié)束模塊不是end if,而是把if翻轉(zhuǎn)過來,成為“fi”。for循環(huán)的語法類似于c語言或者Java語言。
值得注意的是,使用條件時,方括號必須加上空格。例如,if [ $week_end -eq 0 ](這里的-eq,表示equal,即等于,也可以改成“=”,大于這個改成-gt,即greater than的意思。這就不一一列舉了,有興趣的可以自行參考語法)
當(dāng)方括號不加空格時,表示的是數(shù)組的索引,例如data[0]表示的是data數(shù)組第一個索引對應(yīng)的值。