最近公司有些定时任务需要在Linux上执行,所以随手写一些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
#####################
#上面这一段是配置文件,主要是数据库的一些配置(例如,服务器IP,端口,账号密码,数据库名称等等),不加的话,也可以自定义
#后面那两个是为了预防配置文件里可能不存在这个账号密码,所以定义了变量。
#####################
## 判断是否存在参数
if [ $# = 0 ]; then
#当前日期,如: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系统传参,当前日期如:2019-08-10
want_date=$1
#month_id=$1
else
echo "[`date +'%Y%m%d %T'`] 脚本传参不正确,程序退出调度!"
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/"
#导出数据(含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/每周四监控清单/受理量异常清单" "1.业务监控统计报表之受理量异常" \
"/zengqq/每周四监控清单/受理量异常清单" "2.业务监控统计报表之撤单" \
"/zengqq/每周四监控清单/夜间操作监控清单" "3.业务监控统计报表之夜间监控" \
"/zengqq/每周四监控清单/受理量异常清单" "4.受理量异常清单" \
"/zengqq/每周四监控清单/受理量异常清单" "5.撤单清单" \
"/zengqq/每周四监控清单/夜间操作监控清单" "夜间操作监控清单" \
"/hpfj/业务质量稽核清单/受理量异常清单" "受理量异常清单(黄埔)" \
"/byfj/业务质量稽核清单/受理量异常清单" "受理量异常清单(白云)")
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
#复制源文件
put ${source_file}
#重命名文件
rename ${source_file} ${rename_file}
bye
EOF
#删除源文件
rm ${source_file} -f
#返回根目录
cd /
done
其实shell脚本和bat脚本差不多,不过就稳定性和查错情况而言,我觉得shell脚本似乎更胜一筹。对于像我这样的小白,都可以根据shell脚本报错来排查故障。唯一的问题就是,Linux系统对中文的支持不太好。所以即便可以导出中文命名的文件,在传输到Windows服务器时也会出现无法识别文件名而导致无法传输。
所以我还是建议输出时先导出英文的文件名,传输到Windows服务器(这里是132.97.172.153,ftp传输协议)后再进行重命名。
原先以为可以用shell脚本读取数据库客户端的数据,结果报错,所以后面涉及一些需要从数据库里传输变量到shell程序时,都是先导出然后再读取文件。这里的max_date=`cat ${data_path}$'max_date.txt'`就是使用这个原理。先从数据库里把最新日期导出到max_date.txt,然后用cat函数读取这个文件的数据,赋值给max_date变量。
此外,里面的if函数也是有意思。结束模块不是end if,而是把if翻转过来,成为“fi”。for循环的语法类似于c语言或者Java语言。
值得注意的是,使用条件时,方括号必须加上空格。例如,if [ $week_end -eq 0 ](这里的-eq,表示equal,即等于,也可以改成“=”,大于这个改成-gt,即greater than的意思。这就不一一列举了,有兴趣的可以自行参考语法)
当方括号不加空格时,表示的是数组的索引,例如data[0]表示的是data数组第一个索引对应的值。