前言:一个标准的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_path的json值是否为空
echo `date +"%Y-%m-%d%H:%M:%S"`,正在检查post_audit_log,curltmptxt_save,file_posting_path的json值是否为空......>>$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":"这是一个后台循环分发的脚本" #脚本的注释
}