前言:一个标准的shell脚本包括bin、conf、log三个文件夹。

1.bin包含脚本的具体内容。

2.conf包含脚本需要获取的配置。

3.log包含脚本执行过程有无错误的log和跟业务相关的log。

编写脚本的具体过程

下面以curl+post上传脚本为例

Vim  backstage_curlpost_send_zip.sh

#!/bin/bash

#进入脚本目录

cd`dirname $0`

#定义脚本默认错误存放

log_path_flag=../logs

default_error_path=$log_path_flag/defaultlogs

default_error_file=$default_error_path/defaultposterror

if [ ! -d $default_error_path ];then

mkdir -p $default_error_path

fi

exec2>>$default_error_file

#定义json文件

json_path=../conf

json_file=`find$json_path -type f `

#判断json文件是否存在

if [ ! -f $json_file ];then

 echo `date +"%Y-%m-%d%H:%M:%S"`,json no such file >>$default_error_file

 exit

fi

#解析json

function get_value (){

keytmp=$1\"\:\"

cat $json_file |seds#"^M"##g|tr '\n' ' '|sed s#[[:space:]]##g|awk -F "$keytmp"'{print $2}'|awk -F '"' '{print $1}'

}

send_runing_log=`get_valuesend_runing_log`

success_log=`get_valuepost_audit_log`              #正确日志

curlerror=`get_valuecurltmptxt_save`       

zip_copy_path=`get_valuefile_posting_path` #发送端全路径

#根据json初始化log路径

if [ ! -n $send_runing_log ];then

echo `date +"%Y-%m-%d%H:%M:%S"`,send_runing_log value is null,palse check shell or json>>$default_error_file

fi

send_runing_log_path=$log_path_flag

if [ ! -d $send_runing_log_path];then

mkdir -p $send_runing_log_path

fi

#检查post_audit_log,curltmptxt_save,file_posting_pathjson值是否为空

echo `date +"%Y-%m-%d%H:%M:%S"`,正在检查post_audit_log,curltmptxt_save,file_posting_pathjson值是否为空......>>$log_path_flag/$send_runing_log

declare -a parameter_mos=(success_log curlerror zip_copy_path )

for (( parameteri = 0; parameteri< ${#parameter_mos[@]}; ++parameteri ))

do

        tmp_value=${parameter_mos[parameteri]}

      if[ ! -n "${!tmp_value}" ];then

      echo"`date +"%Y-%m-%d %H:%M:%S"`,${parameter_mos[parameteri]} valueis null,palse check shell or json" >>$log_path_flag/$send_runing_log

      exit

      fi

done

curlerror_tmp_save=../tmp

if [ ! -d $curlerror_tmp_save ];then

mkdir -p $curlerror_tmp_save

fi

echo `date +"%Y-%m-%d%H:%M:%S"`,检查完成 >>$log_path_flag/$send_runing_log

#初始化log路径

echo `date +"%Y-%m-%d%H:%M:%S"`,正在初始化log路径......>>$log_path_flag/$send_runing_log

echo `date +"%Y-%m-%d%H:%M:%S"`,初始化log路径完成 >>$log_path_flag/$send_runing_log

#判断file_posting_path是否存

echo `date +"%Y-%m-%d%H:%M:%S"`,正在判断file_posting_path是否存在......>>$log_path_flag/$send_runing_log

if [ ! -d $zip_copy_path ];then  

echo "`date +"%Y-%m-%d%H:%M:%S"`,$zip_copy_path,File path does not exist" >>$log_path_flag/$send_runing_log

exit

fi

echo `date +"%Y-%m-%d%H:%M:%S"`,判断完成 >>$log_path_flag/$send_runing_log

function send_zip(){

#datedetails=`date +"%Y-%m-%d%H:%M:%S"`

lsnumber=`ls $zip_copy_path | greptxt |wc -l`

if [ "$lsnumber" =="0" ];then

echo "`date +"%Y-%m-%d%H:%M:%S"`,$zip_copy_path,NO any log_file exist">>$log_path_flag/$send_runing_log

return 1

fi

#循环扫描读取txt描述文件

for txt_file in `ls $zip_copy_path |grep txt`

do

  cat $zip_copy_path/$txt_file|while read txt_line

  do

#根据txt描述文件解析相应参数

  zip_source_save_file=`echo $txt_line |awk -F ',' '{print $3}' `

  zip_success_number=`echo $txt_line |awk -F ',' '{print $5}'`

  zip_copy_save_file=`echo $txt_line |awk -F ',' '{print $6}'`

  http_url_txt=`echo $txt_line |awk -F ',' '{print $8}'`

  url=`echo $http_url_txt|awk -F '?' '{print $1}'`

  base_dir=`echo $http_url_txt|awk -F '?' '{print $2}'|awk -F '&''{print $1}'|awk -F '=' '{print $2}'`

  date_path=`echo $http_url_txt |awk -F '=' '{print $3}'|awk -F '&''{print $1}'`

  zip_name=`echo $http_url_txt|awk -F '&' '{print $3}'|awk -F '=''{print $2}'`

  post_txt=$url?dir_path=$base_dir\&time_path=$date_path\&file_name=$zip_name

#根据参数发送

curltxt=`/usr/bin/curl -i -s -S -F"action=uploadfile"  -F"file=@$zip_copy_save_file" $post_txt 2>$curlerror_tmp_save/$curlerror`                      #记录curl命令执行情况

curlsedtxt=`echo $curltxt|seds#"

"##g` #对curl命令返回的文本进行处理

#获取发送情况生成日志

#datedetails=`date+"%Y-%m-%d %H:%M:%S"`

log_txt_tmp=`date +"%Y-%m-%d%H:%M:%S"`,$zip_copy_save_file,$zip_source_save_file,$zip_success_number,$post_txt,"curlsuccess"

if [ -n "$curlsedtxt"];then

   if [[ $curlsedtxt =~ "200" ]];then

       sed_tmp_txt=`echo $url|sed's#\/#\\\/#g'`

       sed -i '/'"$sed_tmp_txt"'/d'$zip_copy_path/$txt_file

       success_txt=`echo $curlsedtxt|awk -F'keep-alive' '{print $2}'|sed s#"[[:space:]]"## `

       echo $log_txt_tmp,200,$success_txt>>$log_path_flag/$success_log    

   else

   http_return_txt=`echo $curlsedtxt|sed s#".*HTTP/1.1"##|awk -F"Server" '{print $1}'|sed s#[[:space:]]##`

   body_txt=${http_return_txt#* }

   code_txt=${http_return_txt%% *}

   echo $log_txt_tmp,$code_txt,$body_txt>>$log_path_flag/$success_log

   fi

else

   curl_txt=`cat $curlerror_tmp_save/$curlerror`

   log_txt_tmp=`date +"%Y-%m-%d%H:%M:%S"`,$zip_copy_save_file,$zip_copy_save_file,$zip_success_number,$post_txt,$curl_txt,-,-

   echo $log_txt_tmp >>$log_path_flag/$success_log

fi

done

#判断删除描述文件

if [ ! -s"$zip_copy_path/$txt_file" ];then

copy_txt_file=$zip_copy_path/$txt_file

copy_zip_file=`echo$copy_txt_file|sed s#txt#zip#`

rm -rf $zip_copy_path/$txt_file$copy_zip_file

fi

done

}

#循环扫描txt描述文件

echo `date +"%Y-%m-%d%H:%M:%S"`,进入循环扫描txt描述文件流程 >>$log_path_flag/$send_runing_log

while :

do

echo `date +"%Y-%m-%d%H:%M:%S"`,正在扫描发送zip文件>>$log_path_flag/$send_runing_log

send_zip

echo `date +"%Y-%m-%d%H:%M:%S"`,此次发送过程结束>>$log_path_flag/$send_runing_log

echo `date +"%Y-%m-%d%H:%M:%S"`,脚本正在睡眠5m......>>$log_path_flag/$send_runing_log

sleep 5m

echo `date +"%Y-%m-%d%H:%M:%S"`,脚本睡眠结束 >>$log_path_flag/$send_runing_log

done

配置文件

vim curl_post.json

{

    "send_runing_log":"send_runtime.log",

   "file_posting_path":"/home/zhangchuan/scripts/report_31_archive/data_save/post_31_report_archive",#待发送区域

   "post_audit_log":"send_audit.log", #发送的审计日志按天创建文件夹

   "curltmptxt_save":"curltmptxt"#初始化的时候的存储

   "comments":"这是一个后台循环分发的脚本" #脚本的注释

}