循环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 
 
简单说明如上,有不完善或者看不懂的地方欢迎留言和我交流