千家信息网

如何用Shell脚本生成XML文件

发表于:2024-09-30 作者:千家信息网编辑
千家信息网最后更新 2024年09月30日,这篇文章主要介绍了如何用Shell脚本生成XML文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体是这样:要求是写一个shell脚
千家信息网最后更新 2024年09月30日如何用Shell脚本生成XML文件

这篇文章主要介绍了如何用Shell脚本生成XML文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体是这样:

要求是写一个shell脚本,安装要求查询数据,将符合条件的数据按照客户给定的xml样式进行组装,然后加入到crontab中,定时执行通过scp或者ftp放到客户服务器上。

具体实现步骤:

一、编写生成xml文档的代码

#! /bin/bash# filename: create_xml.sh# create_wangxb_20150123## 从外部传入的第一个参数作为xml的文件名outfile=$1# xml中的缩进位tabs=0# ++++++++++++++++++++++++++++# 组装一个节点,输出到文件# 说一说传参数时的这几个区别:假如有下面这个脚本执行的命令# /path/to/scriptname  opt1  opt2  opt3  opt4 # $0: 的值是默认是脚本的名字,从$1-$4 开始就是参数的值# $# :代表后接的参数『个数』# $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来); # $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。# 在shell中我们可以也可以使用${}包含变量名,来调用变量# ++++++++++++++++++++++++++++put(){    echo '<'${*}'>' >> $outfile}# 这里也是输出一个xml的节点,只是比上面的节点有更多的设置# ${@:2} 的意思:它的值就是由第二个参数开始到最后一个参数,为什么要这样?有时可能你的第二个参数中有空格,shell接受参数是以空格计算的put_tag() {    echo '<'$1'>'${@:2}'' >> $outfile}# 同样是一个输出节点函数,但是添加了CDATA,防止特殊字符造成xml解析失败put_tag_cdata() {    echo '<'$1'>' >> $outfile}put_head(){    put '?'${1}'?'}# 这是一个缩进的算法,自行理解out_tabs(){    tmp=0    tabsstr=""    while [ $tmp -lt $((tabs)) ]    do        tabsstr=${tabsstr}'\t'        tmp=$((tmp+1))    done    echo -e -n $tabsstr >> $outfile}tag_start(){    out_tabs    put $1    tabs=$((tabs+1))}tag() {    out_tabs    if [ "$1" == 0 ]    then        put_tag $2 $(echo ${@:3})    elif [ "$1" == 1 ]    then        put_tag_cdata $2 $(echo ${@:3})    fi}tag_end(){    tabs=$((tabs-1))    out_tabs    put '/'${1}}

这里有一些基础知识:

关于参数:

假如有下面这个脚本执行的命令
/path/to/scriptname opt1 opt2 opt3 opt4

 $0: 的值是默认是脚本的名字,从$1-$4 开始就是参数的值 $# :代表后接的参数『个数』 $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);  $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。 在shell中我们可以也可以使用${}包含变量名,来调用变量

二、从数据库查数据利用上面的函数,制作xml文件

#!/bin/bash# filename: ts_xml.sh# create_wangxb_20150126#PATH=/u01/app/oracle/product/10.2.0/db_1/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/opt/dell/srvadmin/bin:/home/p3s_batch/tools:/home/p3s_batch/binexport PATH# Database account information filesource ~/.p3src#++++++++++++++++++++++++++++++++++++++++++++++++++++++++# set some variable # XMLSCRIPT: 脚本的绝对路径# MATCHING_RESULT_XML: xml_1的文件名 # XML_FUNC_FILE: 生成xml函数文件路径# MATCHING_RESULT_QUERY_DATA: sqlplus 查出数据保存的零时文件# MATCHING_RESULT_QUERY_SQL: sqlplus 查询的sql语句#++++++++++++++++++++++++++++++++++++++++++++++++++++++++# 下面是一些基础的设置export XMLSCRIPT=/usr/p3s/batch/jaaa_match/tmp_xa_wangxbXML_DIR="$XMLSCRIPT/xmldata"XML_FUNC_FILE="xml_func.sh"MATCHING_RESULT_XML="matching_result_"$(date '+%Y%m%d_%H%M%S')".xml"MATCHING_RESULT_QUERY_DATA="matching_result_query_data.tmp"MATCHING_RESULT_QUERY_SQL="matching_result_query.sql"CLIENT_LIST_XML="client_list_"$(date '+%Y%m%d_%H%M%S')".xml"CLIENT_LIST_QUERY_DATA="client_list_query_data.tmp"CLIENT_LIST_QUERY_SQL="client_list_query.sql"# add_wangxb_20150225if [ ! -d "$XML_DIR" ];then    mkdir $XML_DIRfi#+++++++++++++++++++++++++++# modify_wangxb_20150224# check for temporary file #+++++++++++++++++++++++++++if [ -e "$XML_DIR/$MATCHING_RESULT_XML" ];then    rm -f $XML_DIR/$MATCHING_RESULT_XMLfiif [ -e "$XMLSCRIPT/$MATCHING_RESULT_QUERY_DATA" ];then    MATCHING_RESULT_QUERY_DATA="matching_result_query_data_"$(date '+%Y%m%d%H%M%S')".tmp"fi#+++++++++++++++++++++++++++++++++++++++++++++++++# add_wangxb_20150225# check system time,  choice query time period# 这是是根据crontab每天执行的时间,取得我们查询数据库时的where条件的时间区间#+++++++++++++++++++++++++++++++++++++++++++++++++sys_datetime=$(date '+%Y%m%d%H')first_chk_datetime="$(date '+%Y%m%d')04"second_chk_datetime="$(date '+%Y%m%d')12"third_chk_datetime="$(date '+%Y%m%d')20"# 由于服务器crontab是上面的时间,但是执行的shell比较多,在调用我这个shell的时候,不一定就是04:30 ,12:30, 20:30所以,这里的根据系统的时间判断时 范围给的比较宽case $sys_datetime in    "$first_chk_datetime"|"$(date '+%Y%m%d')05"|"$(date '+%Y%m%d')06"|"$(date '+%Y%m%d')07")        chk_start=$(date '+%Y-%m-%d 21:00:00' -d '-1 day')        chk_end=$(date '+%Y-%m-%d 04:29:59')    ;;    "$second_chk_datetime"|"$(date '+%Y%m%d')13"|"$(date '+%Y%m%d')14"|"$(date '+%Y%m%d')15")        chk_start=$(date '+%Y-%m-%d 04:30:00')        chk_end=$(date '+%Y-%m-%d 12:29:59')    ;;    "$third_chk_datetime"|"$(date '+%Y%m%d')21"|"$(date '+%Y%m%d')22"|"$(date '+%Y%m%d')23")        chk_start=$(date '+%Y-%m-%d 12:30:00')        chk_end=$(date '+%Y-%m-%d 20:59:59')    ;;    *)        chk_start=$(date '+%Y-%m-%d 00:00:00')        chk_end=$(date '+%Y-%m-%d 23:59:59')    ;;esac# modify_wangxb_20150310# 下面的是做一个oracle数据库连接的测试,如果连接失败,后续代码不再执行,并且写入错误日志$ORACLE_HOME/bin/sqlplus -s $ORAUSER_WEB_PASDB << EOFset echo offset feedback offalter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';select sysdate from dual;quitEOFif [ $? -ne 0 ]then     echo "********** DBへのリンク己窃した **********"    exitelse    echo "********** DBへのリンクOKです **********"fi# sqlplus就是oracle的一个客户端软件,具体使用方法可以问度娘,这里传入要执行的sql和参数,将结果 > 输出到指定文件$ORACLE_HOME/bin/sqlplus -s $ORAUSER_WEB_PASDB @$XMLSCRIPT/$MATCHING_RESULT_QUERY_SQL "$chk_start" "$chk_end" > $XMLSCRIPT/$MATCHING_RESULT_QUERY_DATA# create matching result's xml file# add_wangxb_20150227# 下面的算法就是将查出的数据进行分析,调用xml函数生成xml文件source "$XMLSCRIPT/$XML_FUNC_FILE" "$XML_DIR/$MATCHING_RESULT_XML"put_head 'xml version="1.0" encoding="utf-8"'tag_start 'ROOT'if [ -s "$XMLSCRIPT/$MATCHING_RESULT_QUERY_DATA" ];then    datas=${XMLSCRIPT}/${MATCHING_RESULT_QUERY_DATA}    #for res in $datas    while read res;    do        stock_id=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $1}')        seirino=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $2}')        match_flg=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $3}')        unmatch_riyuu=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $4}')        up_date_tmp=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $5}')        up_date=$(echo $up_date_tmp | awk 'BEGIN {FS="@"} {print $1 " " $2}')        tag_start 'MATCHING'        tag 0 'STOCKID' ${stock_id:-""}        tag 0 'SEIRINO' ${seirino:-""}        tag 0 'RESULT' ${match_flg:-""}        tag 1 'REASON' ${unmatch_riyuu:-""}        tag 0 'UPDATE_DATE' ${up_date:-""}        tag_end 'MATCHING'    done < $datasfitag_end 'ROOT'rm $XMLSCRIPT/$MATCHING_RESULT_QUERY_DATA# create client list's xml file# add_wangxb_2015027# 下面的是再生成一个xml文件,和上面一样if [ -e "$XML_DIR/$CLIENT_LIST_XML" ];then    rm -f $XML_DIR/$CLIENT_LIST_XMLfiif [ -e "$XMLSCRIPT/$CLIENT_LIST_QUERY_DATA" ];then    CLIENT_LIST_QUERY_DATA="client_list_query_data_"$(date '+%Y%m%d%H%M%S')".tmp"fi$ORACLE_HOME/bin/sqlplus -s $ORAUSER_MND @$XMLSCRIPT/$CLIENT_LIST_QUERY_SQL > $XMLSCRIPT/$CLIENT_LIST_QUERY_DATAsource "$XMLSCRIPT/$XML_FUNC_FILE" "$XML_DIR/$CLIENT_LIST_XML"put_head 'xml version="1.0" encoding="utf-8"'tag_start 'ROOT'if [ -s "$XMLSCRIPT/$CLIENT_LIST_QUERY_DATA" ];then    datas=${XMLSCRIPT}/${CLIENT_LIST_QUERY_DATA}    #for res in $datas    while read res;    do        corporation_id=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $1}')        corporation_name=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $2}')        client_id=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $3}')        client_print_name=$(echo $res | awk 'BEGIN {FS="\\^\\*\\^"} {print $4}')        tag_start 'CLIENT'        tag 0 'CORPORATION_ID' ${corporation_id:-""}        tag 1 'CORPORATION_NAME' ${corporation_name:-""}        tag 0 'CLIENT_ID' ${client_id:-""}        tag 1 'CLIENT_PRINT_NAME' ${client_print_name:-""}        tag_end 'CLIENT'    done < $datasfitag_end 'ROOT'rm $XMLSCRIPT/$CLIENT_LIST_QUERY_DATA# add_wangxb_20150304# Convert xml file encoding# 这是将xml文件进行转码,命令是iconvif [ -e "$XML_DIR/$MATCHING_RESULT_XML" ];then    echo "********** matching_result.xmlファイルコ〖ドを啪垂し、**********"    iconv -f euc-jp -t utf-8 $XML_DIR/$MATCHING_RESULT_XML  -o $XML_DIR/$MATCHING_RESULT_XML.utf-8    mv $XML_DIR/$MATCHING_RESULT_XML.utf-8 $XML_DIR/$MATCHING_RESULT_XMLfiif [ -e "$XML_DIR/$CLIENT_LIST_XML" ];then    echo "********** client_list.xmlフィルコ〖ドを啪垂し、**********"    iconv -f euc-jp -t utf-8 $XML_DIR/$CLIENT_LIST_XML  -o $XML_DIR/$CLIENT_LIST_XML.utf-8    mv $XML_DIR/$CLIENT_LIST_XML.utf-8 $XML_DIR/$CLIENT_LIST_XMLfi# add_wangxb_20150304# Send the xml file to the destination server by ftp#ftp_host="222.***.***.***"#USER="***"#PASS="***"#ftp -i -n $ftp_host << EOF#user $USER $PASS#cd /#lcd $XML_DIR/#put $MATCHING_RESULT_XML#put $CLIENT_LIST_XML#quit#EOF# test ftp# 通过ftp将xml文件放到客户服务器上,ftp_host:客户服务器地址,user登录名,pass密码ftp_host="***.***.***.***"USER="***"PASS="***"dir="/upload"ftp -i -n $ftp_host << EOFuser $USER $PASScd /upload/lcd $XML_DIR/put $MATCHING_RESULT_XMLput $CLIENT_LIST_XMLquitEOF# Save the program log fileYYMM=$(date +'%Y%m%d%H%M')cp /tmp/create_xml.log /usr/p3s/batch/jaaa_match/tmp_xa_wangxb/logs/create_xml.log.$YYMM# Send error log files into the Admin mailboxinfo_to_mail_1="**@**.co.jp"info_to_mail_2="***@**.co.jp"# nkf 日文转码的一个命令title=$(echo "test" | nkf -j)nkf -j < /tmp/create_xml.log | mail -s $title $info_to_mail_1 $info_to_mail_2#exit

本来是用scp传送的,但是后面修改了,这里把自己为scp传送找到的一个,不用密码可立即登入的 ssh 用户

下面是执行的两个sql文件

SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFFSET ECHO OFFSET HEADING OFFSET TIMI OFFSET LINESIZE 1000SET WRAP OFFSELECT s.STOCKID|| '^*^' ||a.SERI_NO|| '^*^' ||a.MATCH_FLG|| '^*^' ||a.UNMATCH_RIYUU|| '^*^' ||to_char(a.UP_DATE,[email protected]:MI:SS') UP_DATE FROM aaa_stock_db a LEFT JOIN SENDDATAAPPRAISALPROTO s ON a.SERI_NO=s.SEIRINO WHERE a.UP_DATE BETWEEN to_date('&1','yyyy-mm-dd hh34:mi:ss') AND to_date('&2','yyyy-mm-dd hh34:mi:ss') AND a.DEL_FLG=0 ORDER BY a.UP_DATE DESC;exit
SET PAGESIZE 0SET FEEDBACK OFFSET VERIFY OFFSET ECHO OFFSET HEADING OFFSET TIMI OFFSET LINESIZE 1000SET WRAP OFFSELECT a.CORPORATION_ID|| '^*^' ||a.CORPORATION_NAME|| '^*^' ||b.CLIENT_ID|| '^*^' ||(select CLIENT_PRINT_NAME from CLIENT_MASTER where CLIENT_ID = b.CLIENT_ID) as CLIENT_PRINT_NAME FROM M_CORPORATION_MASTER a LEFT JOIN M_CORPORATION_GROUP b ON (a.CORPORATION_ID = b.CORPORATION_ID) WHERE a.DEL_FLG=0 AND b.DEL_FLG=0;exit

三、来看看效果

当然中间出现了许多bug,不过慢慢修改吗,兵来将挡,水来土掩,bug来了自己调么

感谢你能够认真阅读完这篇文章,希望小编分享的"如何用Shell脚本生成XML文件"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

文件 参数 脚本 代表 数据 变量 生成 面的 函数 命令 客户 就是 时间 服务器 篇文章 节点 utf-8 之意 服务 输出 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 最强蜗牛怎么找回以前的服务器 软件开发流程需要哪些软件 戴尔服务器哪家是专业做的 中国台湾it软件开发哪家强 ads批量写入数据库 软件开发企业需要交纳什么税 贵州省网络安全法 网络安全专项演习的时间 乡镇网络安全周宣传活动总结 湖北web前端软件开发定制费用 面向方面的软件开发方法 如何将家里电脑设置成文件服务器 php ssh连接数据库 云数据库申请退款 找到移动数据库 计算机的网络技术好不好 安世亚太软件开发 软件开发中质量与成本的关系 怎么上传作业到教学服务器 服务器出现问题请稍后 番禺物联网软件开发价格表 长沙 国家网络安全产业园 国内云服务器招商项目网站平台 mssql怎么抽取数据库 数据库自动备份计划 周鸿祎国家网络安全 湖南株洲软件开发公司电话 海南dellr840服务器 软件开发中质量与成本的关系 网络安全审查的介绍ppt
0