用Shell脚本生成XML文件实例详解

今天把这段时间学习完shell后完成工作上的一个小案件整理了一下,分享给大家!

说来也巧了,作为一个刚刚毕业半年的菜鸟,进入公司后,听公司的大牛推荐学习linux–”鸟哥的私房菜“,基本上是从去年8月份开始到了今年的1月份,基本上是把基础篇看完了,开始了解shell脚本的相关知识。刚好公司有了一个shell脚本的案件给我了,时间上也没有多紧。然后就一边学习一边开始做,虽然中途客户反映先前的业务逻辑有问题耽搁了两周,但总算是到最后完成了,自己学习的东西能用到很开心,今天闲了,把代码整理了一下,分享给大家

具体是这样:

要求是写一个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 ''${@:2}'' >> $outfile}# 同样是一个输出节点函数,但是添加了CDATA,防止特殊字符造成xml解析失败put_tag_cdata() {    echo '' >> $outfile}put_head(){    put '?'${1}'?'}# 这是一个缩进的算法,自行理解out_tabs(){    tmp=0    tabsstr=""    while [ $tmp -lt $((tabs)) ]    do        tabsstr=${tabsstr}''        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 < 输出到指定文件$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  $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 hh24:mi:ss') AND to_date('&2','yyyy-mm-dd hh24: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文件实例详解

就这样简单的整理一下,可能光这么写不够完整,但是,中间设计的知识也很多,不能展开了说,做个分享,大家有用到的时候也是个思路,具体的某些知识点可以用到了再去找资料了。

以上就是用Shell脚本生成XML文件实例详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1429007.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 02:06:49
下一篇 2025年12月17日 02:07:09

相关推荐

  • XML文档不能使用css样式表怎么办

    XML文档不能使用css样式表可能是链接方法出错了,正确的链接方法为“”。XML旨在存储和传输数据,XML的设计使其可以被人类和机器读取。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 xml不显示css样式 介绍: 您必须了解术语XML,并且…

    2025年12月24日
    000
  • 如何使用CSS 显示 XML

    使用CSS显示XML的方法:首先打开相应的代码文件;然后通过“”方法把XML文件链接到CSS文件即可。 推荐:《css视频教程》 使用 CSS 显示 XML 通过使用 CSS,可为 XML 文档添加显示信息。 使用 CSS 显示您的 XML? 立即学习“前端免费学习笔记(深入)”; 使用 CSS 来…

    2025年12月24日
    000
  • txt改成html怎么运行_txt转html运行方法【教程】

    将txt转为可运行的html需先添加标准html结构,如doctype、html、head、body标签,并将文本用p等标签包裹,保存为.html后缀,再用浏览器打开即可正常显示,批量转换可用脚本自动化处理。 把txt文件改成html并运行,其实并不复杂。关键是要理解txt是纯文本格式,而html是…

    2025年12月23日
    000
  • Linux rsync镜像备份,HTML+CSS代码安全永存!

    使用rsync可实现网站文件的安全镜像备份。1、本地备份通过rsync -av –delete命令同步HTML与CSS文件,保留属性并保持目录一致;2、配置SSH密钥(ssh-keygen与ssh-copy-id)实现免密安全传输;3、远程同步使用rsync -avz -e ssh将数据…

    2025年12月23日
    000
  • Linux lftp镜像传输,HTML+CSS站点批量推送!

    使用lftp的mirror命令可实现本地HTML/CSS网站批量同步到远程服务器,1、通过lftp ftp://用户:密码@地址连接并进入交互界面;2、用lcd和cd分别设置本地与远程路径;3、执行mirror –reverse –delete –verbose完…

    2025年12月23日
    000
  • Linux Ranger文件管理器中批量操作HTML文件

    1、启动Ranger并导航至HTML文件目录;2、用/搜索.html文件并按m a标记;3、执行:bulkrename批量修改文件名;4、用:!加shell命令如sed批量替换内容;5、通过rc.conf添加自定义命令mh实现一键更新标题。 如果您需要在Linux系统中对多个HTML文件进行统一管理…

    2025年12月23日
    000
  • Mac用Raycast一键搜索HTML5新特性文档

    通过Raycast配置自定义脚本命令,一键打开MDN上HTML5特性文档页面;2. 将HTML5官方指南添加为浏览器书签,并利用Raycast书签搜索功能快速访问;3. 安装支持API的扩展,在Raycast中直接预览HTML5新特性摘要信息。 如果您希望在Mac上快速查找HTML5的最新特性文档,…

    2025年12月23日
    000
  • Linux rclone将HTML+CSS项目推送到GitHub Pages

    先配置rclone同步文件至本地Git仓库,再通过Git推送到GitHub Pages实现部署。具体步骤为:安装rclone并克隆GitHub仓库→使用rclone sync命令将构建目录同步到本地项目(排除.git目录)→进入项目目录执行git add、commit、push提交至main或gh-…

    2025年12月23日
    000
  • rclone直连GitHub Pages,HTML+CSS一键上线!

    首先配置rclone将HTML/CSS文件同步至本地Git仓库,再通过Git提交并推送到GitHub Pages,最后创建自动化脚本实现一键部署,完成项目上线。 如果您希望将本地的HTML和CSS项目快速部署到GitHub Pages,并通过rclone实现高效同步,可以借助rclone的强大功能完…

    2025年12月23日
    000
  • Windows PowerShell批量检查HTML中CSS路径是否正确

    通过PowerShell读取HTML文件中的link标签,提取CSS路径并验证本地是否存在。2. 脚本遍历指定目录的HTML文件,匹配rel=”stylesheet”的href属性,转换为本地路径后检查文件存在性。3. 输出结果区分正常与缺失的CSS文件,支持相对路径,忽略外…

    2025年12月23日
    000
  • Linux Conky监控本地服务器HTML+CSS加载时间

    使用curl脚本测量本地服务器HTML/CSS加载时间,并通过Conky周期性显示。1. 编写bash脚本调用curl获取time_total等指标;2. 在~/.conkyrc中用${execi 10 ~/scripts/load_time.sh}每10秒执行;3. 可分离监控HTML与CSS文件…

    2025年12月23日
    000
  • Linux grep秒杀项目里700个无用CSS类!

    首先通过grep提取CSS类生成列表,再扫描模板文件收集使用类,利用comm找出未引用类,结合sed安全删除,并封装为可复用脚本实现自动化清理。 如果您在项目中发现大量无用的CSS类影响代码整洁和性能,可以通过Linux命令快速定位并清理这些冗余样式。grep命令结合其他文本处理工具能高效扫描源码与…

    2025年12月23日
    000
  • Linux Conky桌面显示当前编辑的HTML文件名

    答案:通过脚本检测活动窗口标题、监控编辑器打开文件或inotify监听文件系统事件,Conky可实时显示正在编辑的HTML文件名。 如果您在使用Linux桌面环境编辑HTML文件时,希望Conky能够实时显示当前正在编辑的文件名,则可以通过脚本结合Conky配置实现。此功能依赖于检测活跃的文本编辑器…

    2025年12月23日
    000
  • Mac用iTerm2分窗口同时编辑多个HTML文件

    使用iTerm2分屏结合vim或nano在Mac上高效编辑多个HTML文件。首先打开iTerm2,用Command+D垂直分屏或Command+Shift+D水平分屏;在各窗格分别运行vim index.html、vim about.html或nano header.html、nano footer…

    2025年12月23日
    000
  • Mac Übersicht小部件实时显示HTML中CSS类名

    可通过JavaScript定时查询DOM元素的classList或className属性实现实时显示CSS类名,结合shell脚本调用curl获取远程HTML并解析class内容,利用setInterval每秒更新一次数据显示,同时需处理跨域与权限问题确保资源可访问。 Mac 的 Übersicht…

    2025年12月23日
    000
  • Linux用rofi菜单快速打开最近HTML练习文件

    答案:通过创建Shell脚本结合rofi菜单与快捷键,可在Linux桌面快速打开最近编辑的HTML文件。首先编写脚本查找指定目录下7天内修改的.html文件,利用find和ls命令筛选并排序,通过rofi显示可选列表,用户选择后由xdg-open打开;接着将脚本集成至rofi主启动器菜单,添加“Re…

    2025年12月23日
    000
  • rofi菜单一键生成HTML+CSS完整项目结构!

    答案:通过Shell脚本与rofi集成实现HTML+CSS项目一键创建。首先编写脚本生成包含css、js、images目录及基础文件的项目结构,并填充默认HTML内容;接着创建rofi菜单脚本,提供web、blog、dashboard等选项,调用对应项目生成逻辑;最后配置模板预设,在主脚本中添加模板…

    2025年12月23日
    000
  • Mac Raycast一键打开最近编辑的HTML+CSS配对

    答案:通过Raycast的文件搜索、自定义脚本和代码编辑器工作区组合实现高效打开最近编辑的HTML+CSS文件对。首先用文件搜索快速定位最近修改的HTML和CSS文件,结合Tab切换到文件类别查看最近访问记录;其次创建Shell脚本并添加至Raycast脚本扩展,实现一键批量打开指定配对文件;最后推…

    2025年12月23日
    000
  • Linux tmux会话保存HTML学习进度下次继续

    使用tmux创建持久会话可实现断开后恢复HTML编辑,先执行tmux new -s html_learning创建会话,在其中用vim编辑文件,按Ctrl+B后按D分离会话;重新登录后通过tmux attach -t html_learning恢复工作状态;还可编写脚本自动检测并附加会话,提升效率。…

    2025年12月23日
    000
  • Mac Sublime Text 4一键创建HTML+CSS项目模板

    通过自定义代码片段和Shell脚本,可在Mac上用Sublime Text 4高效创建HTML+CSS项目。1. 创建html5前缀的snippet生成HTML模板;2. 编写shell脚本一键生成含css/js/img目录的项目结构;3. 安装SideBarEnhancements插件提升文件操作…

    2025年12月23日
    300

发表回复

登录后才能评论
关注微信