循环FTP脚本的共享和说明
此脚本为本人工作所写,作为 shell 初学者,可以一起学习下
第 1 行为脚本第一行,当运行脚本时告诉系统选择哪一个 shell, 若没有第一行,系统会选择默认的 shell
1 #!/bin/sh
第 2-9 行验证参数,若参数个数不为 1 ,则报错
2 # 验证参数个数
3 if [ $# -ne 1 ]
4 then
5 echo "Param error !"
6 echo "Usage: $0 date"
7 echo "Example: $0 20110808"
8 exit 1
9 fi
10
11 # 调度日期
第 12-14 行,定义变量
12 etl_date=$1
13
14 ok=`echo ${etl_date}|grep -w "20[0-9][0-9][0-9][0-9][0-9][0-9]"|wc -l`
第 15-22 行验证参数格式,若格式不为 20xxxxxx ,则报错
15 # 验证参数格式
16 if [ ${ok} -eq 0 ]
17 then
18 echo "Param error !"
19 echo "Usage: $0 date"
20 echo "Example: $0 20110808"
21 exit 1
22 fi
23
第 24-26 行定义变量
24 sub1=`echo ${etl_date} | cut -c 1-4`
25 sub2=`echo ${etl_date} | cut -c 5-6`
26 sub3=`echo ${etl_date} | cut -c 7-8`
27
第 29 行从配置文件 ftp.cfg 中读取所有的系统名称
28 # 获取所有的系统
29 system_all=` awk -F= '{ if ( $1~/system_name/ ) print $ 2}' /home/edw/cjb/bin/ftp/ftp_get.cfg `
30
31 # 获取系统个数
第 32 行对刚才读取的系统名称进行统计个数,个数为 system_num
32 system_num=`echo ${system_all} | awk -F+ '{print NF}'`
33
34 echo " 当前有 [${system_all}]${system_num} 个系统 "
35
第 37 行,对 num 说明一下,用 num 从 1 增长到 system_num 来执行一个循环,如果不用 num ,也可以用 shift 移动变量来完成
36 # 循环执行辅助参数
37 num=1
38
39 # 根据系统个数 ${system_num}, 执行 ${system_name} 次循环
40 while [ ${num} -le ${system_num} ]
41 do
42 sys_name=`echo ${system_all} | awk -F+ '{print $'$num'}'`
43 echo " 第 ${num} 个系统为 ${sys_name}"
第 44-48 行,从配置文件 ftp_get.cfg 中读取 ftp 的 ip 地址,用户名,密码,远程 / 本地路径
44 remote_ip=` awk -F= ' { if ( $1~/'${sys_name}'_ADD/ ) print $2 } ' /home/edw/cjb/bin/ftp/ftp_get.cfg `
45 user_name=` awk -F= ' { if ( $1~/'${sys_name}'_USR/ ) print $2 } ' /home/edw/cjb/bin/ftp/ftp_get.cfg `
46 pass_word=` awk -F= ' { if ( $1~/'${sys_name}'_PWD/ ) print $2 } ' /home/edw/cjb/bin/ftp/ftp_get.cfg `
47 rmt_dir=` awk -F= ' { if ( $1~/'${sys_name}'_REMOTEDIR/ ) print $2 }' /home/edw/cjb/bin/ftp/ftp_get.cfg `
48 loc_dir=` awk -F= ' { if ( $1~/'${sys_name}'_LOCALDIR/ ) print $2 }' /home/edw/cjb/bin/ftp/ftp_get.cfg `
49
50 # 参数二次解析
第 51 行利用eval对 rmt_dir 进行二次解析, rmt_dir 从 ftp_get.cfg 读取后仍然包含参数,需要进行第二次解析,然后赋值给 remote_dir ,第 54 行同理
51 remote_dir=`eval echo ${rmt_dir}`
52 echo "remote_dir is ${remote_dir}"
53 # 参数二次解析
54 local_dir=`eval echo ${loc_dir}`
55 echo "local_dir is ${local_dir}"
56
57 # 若本地路径不存在,则自动创建
58 [ -d ${local_dir} ]||mkdir -p ${local_dir}
59
60 # 进入目标路径
61 cd ${local_dir}
62
63 # 若日志文件不存在,则自动创建
64 [ -f autorun_${etl_date}.log ] || touch autorun_${etl_date}.log
65
66 # 向日志插入运行时间
67 echo "========================RunTime is [ `date +\"%Y-%m-%d %T\"` ]==========================" >>autorun_${etl_date}.log
68
69 echo " 开始从 ${sys_name} 系统取数 ..."
第 70 行,从 ${sys_name}.cfg 中读取需要 ftp 的文件名,开始 ftp 操作
70 cat /home/edw/cjb/bin/ftp/${sys_name}.cfg | grep -v '^#' | while read LINE
71 do
72 f_name=`echo ${LINE} | awk '{print $1}'`
73 # 参数二次解析
74 file_name=`eval echo ${f_name}`
75 echo file_name is ${file_name}
76 # 开始 ftp
第 77-84 行,为整个 ftp 过程
77 ftp -n ${remote_ip} <<EOF
78 user ${user_name} ${pass_word}
79 cd ${remote_dir}
80 bin
81 get ${file_name}
82 close
83 bye
84 EOF
85 done | tee -a autorun_${etl_date}.log
86 echo " 请查看日志 `pwd`/autorun_${etl_date}.log"
87
88 # 每执行完一个系统, num 自动加 1 ,开始从下一个系统取数
89 num=`expr ${num} + 1`
90 done
简单说明如上,有不完善或者看不懂的地方欢迎留言和我交流