溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何用Shell腳本生成XML文件

發(fā)布時間:2021-09-17 13:41:20 來源:億速云 閱讀:225 作者:小新 欄目:編程語言

這篇文章主要介紹了如何用Shell腳本生成XML文件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

具體是這樣:

要求是寫一個shell腳本,安裝要求查詢數(shù)據(jù),將符合條件的數(shù)據(jù)按照客戶給定的xml樣式進(jìn)行組裝,然后加入到crontab中,定時執(zhí)行通過scp或者ftp放到客戶服務(wù)器上。

具體實現(xiàn)步驟:

一、編寫生成xml文檔的代碼

#! /bin/bash
# filename: create_xml.sh
# create_wangxb_20150123
#
# 從外部傳入的第一個參數(shù)作為xml的文件名
outfile=$1
# xml中的縮進(jìn)位
tabs=0

# ++++++++++++++++++++++++++++
# 組裝一個節(jié)點,輸出到文件
# 說一說傳參數(shù)時的這幾個區(qū)別:假如有下面這個腳本執(zhí)行的命令
# /path/to/scriptname  opt1  opt2  opt3  opt4 
# $0: 的值是默認(rèn)是腳本的名字,從$1-$4 開始就是參數(shù)的值
# $# :代表后接的參數(shù)『個數(shù)』
# $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每個變量是獨立的(用雙引號括起來); 
# $* :代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字節(jié),默認(rèn)為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
# 在shell中我們可以也可以使用${}包含變量名,來調(diào)用變量
# ++++++++++++++++++++++++++++
put(){
    echo '<'${*}'>' >> $outfile
}

# 這里也是輸出一個xml的節(jié)點,只是比上面的節(jié)點有更多的設(shè)置
# ${@:2} 的意思:它的值就是由第二個參數(shù)開始到最后一個參數(shù),為什么要這樣?有時可能你的第二個參數(shù)中有空格,shell接受參數(shù)是以空格計算的
put_tag() {
    echo '<'$1'>'${@:2}'</'$1'>' >> $outfile
}
# 同樣是一個輸出節(jié)點函數(shù),但是添加了CDATA,防止特殊字符造成xml解析失敗
put_tag_cdata() {
    echo '<'$1'><![CDATA['${@:2}']]></'$1'>' >> $outfile
}

put_head(){
    put '?'${1}'?'
}
# 這是一個縮進(jìn)的算法,自行理解
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}
}

這里有一些基礎(chǔ)知識:

關(guān)于參數(shù):

假如有下面這個腳本執(zhí)行的命令
/path/to/scriptname opt1 opt2 opt3 opt4

 $0: 的值是默認(rèn)是腳本的名字,從$1-$4 開始就是參數(shù)的值
 $# :代表后接的參數(shù)『個數(shù)』
 $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每個變量是獨立的(用雙引號括起來); 
 $* :代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字節(jié),默認(rèn)為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
 在shell中我們可以也可以使用${}包含變量名,來調(diào)用變量

二、從數(shù)據(jù)庫查數(shù)據(jù)利用上面的函數(shù),制作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/bin
export PATH
# Database account information file
source ~/.p3src

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# set some variable 
# XMLSCRIPT: 腳本的絕對路徑
# MATCHING_RESULT_XML: xml_1的文件名 
# XML_FUNC_FILE: 生成xml函數(shù)文件路徑
# MATCHING_RESULT_QUERY_DATA: sqlplus 查出數(shù)據(jù)保存的零時文件
# MATCHING_RESULT_QUERY_SQL: sqlplus 查詢的sql語句
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 下面是一些基礎(chǔ)的設(shè)置
export XMLSCRIPT=/usr/p3s/batch/jaaa_match/tmp_xa_wangxb
XML_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_20150225
if [ ! -d "$XML_DIR" ];
then
    mkdir $XML_DIR
fi

#+++++++++++++++++++++++++++
# modify_wangxb_20150224
# check for temporary file 
#+++++++++++++++++++++++++++
if [ -e "$XML_DIR/$MATCHING_RESULT_XML" ];
then
    rm -f $XML_DIR/$MATCHING_RESULT_XML
fi

if [ -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
# 這是是根據(jù)crontab每天執(zhí)行的時間,取得我們查詢數(shù)據(jù)庫時的where條件的時間區(qū)間
#+++++++++++++++++++++++++++++++++++++++++++++++++
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"
# 由于服務(wù)器crontab是上面的時間,但是執(zhí)行的shell比較多,在調(diào)用我這個shell的時候,不一定就是04:30 ,12:30, 20:30所以,這里的根據(jù)系統(tǒng)的時間判斷時 范圍給的比較寬
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數(shù)據(jù)庫連接的測試,如果連接失敗,后續(xù)代碼不再執(zhí)行,并且寫入錯誤日志
$ORACLE_HOME/bin/sqlplus -s $ORAUSER_WEB_PASDB << EOF
set echo off
set feedback off
alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
select sysdate from dual;
quit
EOF
if [ $? -ne 0 ]
then 
    echo "********** DBへのリンク己竊した **********"
    exit
else
    echo "********** DBへのリンクOKです **********"
fi
# sqlplus就是oracle的一個客戶端軟件,具體使用方法可以問度娘,這里傳入要執(zhí)行的sql和參數(shù),將結(jié)果 > 輸出到指定文件
$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
# 下面的算法就是將查出的數(shù)據(jù)進(jìn)行分析,調(diào)用xml函數(shù)生成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 < $datas
fi
tag_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_XML
fi

if [ -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_DATA

source "$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 < $datas
fi
tag_end 'ROOT'
rm $XMLSCRIPT/$CLIENT_LIST_QUERY_DATA

# add_wangxb_20150304
# Convert xml file encoding
# 這是將xml文件進(jìn)行轉(zhuǎn)碼,命令是iconv
if [ -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_XML
fi
if [ -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_XML
fi

# 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文件放到客戶服務(wù)器上,ftp_host:客戶服務(wù)器地址,user登錄名,pass密碼
ftp_host="***.***.***.***"
USER="***"
PASS="***"
dir="/upload"
ftp -i -n $ftp_host << EOF
user $USER $PASS
cd /upload/
lcd $XML_DIR/
put $MATCHING_RESULT_XML
put $CLIENT_LIST_XML
quit
EOF

# Save the program log file
YYMM=$(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 mailbox
info_to_mail_1="**@**.co.jp"
info_to_mail_2="***@**.co.jp"
# nkf 日文轉(zhuǎn)碼的一個命令
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 用戶

下面是執(zhí)行的兩個sql文件

SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SET ECHO OFF
SET HEADING OFF
SET TIMI OFF
SET LINESIZE 1000
SET WRAP OFF

SELECT 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 0
SET FEEDBACK OFF
SET VERIFY OFF
SET ECHO OFF
SET HEADING OFF
SET TIMI OFF
SET LINESIZE 1000
SET WRAP OFF

SELECT 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

三、來看看效果

當(dāng)然中間出現(xiàn)了許多bug,不過慢慢修改嗎,兵來將擋,水來土掩,bug來了自己調(diào)么

如何用Shell腳本生成XML文件

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何用Shell腳本生成XML文件”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI