我试图在 for 循环中使用 xmlstarlet 在同一标记的多次出现中选择属性值,但迭代中的 $i 没有按预期取值,我将其引用为“$i”,并在 -m 中使用转义字符' ',但它似乎没有正确解释它,不知道我应该如何解决这个问题:
for i in {1..16};
do
FTRSERVER=`xmlstarlet sel -t -m '//JOB[\"$i\"]' -v './AUTOEDIT2[@NAME="%%FTP-RHOST"]/@VALUE' ~testhwa/FTPJobstable007.xml`
done
输入 XML 示例,多次出现 JOB 标签:
<JOB
ACTIVE_TILL="20141124"
APPLICATION="CTDS0320"
APPL_FORM="AFT"
APPL_TYPE="FILE_TRANS"
APPL_VER="6.1.01"
APR="1"
AUG="1"
AUTHOR="wyy"
AUTOARCH="0"
CHANGE_DATE="20190403"
CHANGE_TIME="141554"
CHANGE_USERID="ecsadmin"
CM_VER="610"
CONFIRM="0"
CREATION_DATE="20190328"
CREATION_TIME="105555"
CREATION_USER="singhm7"
CRITICAL="0"
CYCLIC="0"
CYCLIC_TOLERANCE="0"
CYCLIC_TYPE="Interval"
DAYS_AND_OR="OR"
DEC="1"
DESCRIPTION="Processes Source data files FTP from Source System"
DOCLIB="/prod/appl/ctds/Doc"
DOCMEM="energent_billing_delta.doc"
FEB="1"
GROUP="@CTDS-BW"
IND_CYCLIC="START"
INTERVAL="00000M"
JAN="1"
JOBNAME="energent_billing_delta-FTP"
JUL="1"
JUN="1"
MAR="1"
MAXDAYS="0"
MAXRERUN="0"
MAXRUNS="0"
MAXWAIT="7"
MAY="1"
MEMLIB="Not in use for application jobs"
MEMNAME="energent_billing_delta-FTP"
MULTY_AGENT="N"
NODEID="vprv0320"
NOV="1"
OCT="1"
OWNER="ctds_energent"
PARENT_TABLE="@CTDS"
PRIORITY="AA"
RETRO="0"
RULE_BASED_CALENDAR_RELATIONSHIP="OR"
SEP="1"
SHIFT="IGNOREJOB"
SHIFTNUM="+00"
SYSDB="0"
TASKTYPE="Job"
USE_INSTREAM_JCL="N"
WEEKSCAL="BCD-Y">
<INCOND AND_OR="AND" NAME="CTDS0320-ENERGENT-BILLING-DELTA-OK" ODATE="ODAT"/>
<OUTCOND NAME="CTDS0320-ENERGENT-BILLING-DELTA-FTP" ODATE="ODAT" SIGN="ADD"/>
<AUTOEDIT2 NAME="%%FTP-ACCOUNT" VALUE="ctds_energent"/>
<AUTOEDIT2 NAME="%%FTP-LOSTYPE" VALUE="Unix"/>
<AUTOEDIT2 NAME="%%FTP-LUSER" VALUE="ctds"/>
<AUTOEDIT2 NAME="%%FTP-ROSTYPE" VALUE="Windows"/>
<AUTOEDIT2 NAME="%%FTP-RUSER" VALUE="[email protected]"/>
<AUTOEDIT2 NAME="%%FTP-LPATH1" VALUE="/prod/appl/ctds/Publish/ENERGENT/*"/>
<AUTOEDIT2 NAME="%%FTP-RPATH1" VALUE="/\Business Intelligence-Gas Consumption\Energent\Outgoing\Gas Consumption\"/>
<AUTOEDIT2 NAME="%%FTP-PATH" VALUE="Not in use for application jobs"/>
<AUTOEDIT2 NAME="%%FTP-USE_DEF_NUMRETRIES" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-RPF" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-CLEAR_ALL" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-CONNTYPE2" VALUE="FTP"/>
<AUTOEDIT2 NAME="%%FTP-CONNTYPE1" VALUE="LOCAL"/>
<AUTOEDIT2 NAME="%%FTP-LHOST" VALUE="Local"/>
<AUTOEDIT2 NAME="%%FTP-RHOST" VALUE="hdq-nt164"/>
<AUTOEDIT2 NAME="%%FTP-LPASSIVE" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-RPASSIVE" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD2" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD3" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD4" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD5" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRANSFER_NUM" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TYPE1" VALUE="A"/>
<AUTOEDIT2 NAME="%%FTP-TYPE2" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE3" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE4" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE5" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-UNIQUE1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TRIM1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM2" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM3" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM4" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM5" VALUE="1"/>
</JOB>
<JOB
ACTIVE_TILL="20141124"
APPLICATION="CTDS-VPRV0342"
APPL_FORM="AFT"
APPL_TYPE="FILE_TRANS"
APPL_VER="6.1.01"
APR="1"
AUG="1"
AUTHOR="wyy"
AUTOARCH="0"
CHANGE_DATE="20190716"
CHANGE_TIME="233201"
CHANGE_USERID="pahwar"
CM_VER="610"
CONFIRM="0"
CREATION_DATE="20190611"
CREATION_TIME="072632"
CREATION_USER="pahwar"
CRITICAL="0"
CYCLIC="0"
CYCLIC_TOLERANCE="0"
CYCLIC_TYPE="Interval"
DAYS_AND_OR="OR"
DEC="1"
DESCRIPTION="Processes Source data files FTP from Source System"
DOCLIB="/prod/appl/ctds/Doc/"
DOCMEM="energent_billing_delta.doc"
FEB="1"
GROUP="@CTDS-BW"
IND_CYCLIC="START"
INTERVAL="00000M"
JAN="1"
JOBNAME="energent_billing_delta-FTP"
JUL="1"
JUN="1"
MAR="1"
MAXDAYS="0"
MAXRERUN="0"
MAXRUNS="0"
MAXWAIT="7"
MAY="1"
MEMLIB="Not in use for application jobs"
MEMNAME="energent_billing_delta-FTP"
MULTY_AGENT="N"
NODEID="vprv0342"
NOV="1"
OCT="1"
OWNER="ctds_energent"
PARENT_TABLE="@CTDS-VPRV0342"
PRIORITY="AA"
RETRO="0"
RULE_BASED_CALENDAR_RELATIONSHIP="OR"
SEP="1"
SHIFT="IGNOREJOB"
SHIFTNUM="+00"
SYSDB="0"
TASKTYPE="Job"
USE_INSTREAM_JCL="N"
WEEKSCAL="BCD-Y">
<INCOND AND_OR="AND" NAME="V0342-ENERGENT-BILLING-DELTA-OK" ODATE="ODAT"/>
<OUTCOND NAME="V0342-ENERGENT-BILLING-DELTA-FTP" ODATE="ODAT" SIGN="ADD"/>
<AUTOEDIT2 NAME="%%FTP-ACCOUNT" VALUE="ctds_energent"/>
<AUTOEDIT2 NAME="%%FTP-LOSTYPE" VALUE="Unix"/>
<AUTOEDIT2 NAME="%%FTP-LUSER" VALUE="ctds"/>
<AUTOEDIT2 NAME="%%FTP-ROSTYPE" VALUE="Windows"/>
<AUTOEDIT2 NAME="%%FTP-RUSER" VALUE="[email protected]"/>
<AUTOEDIT2 NAME="%%FTP-LPATH1" VALUE="/prod/appl/ctds/Publish/ENERGENT/*"/>
<AUTOEDIT2 NAME="%%FTP-RPATH1" VALUE="/\Business Intelligence-Gas Consumption\Energent\Outgoing\Gas Consumption\"/>
<AUTOEDIT2 NAME="%%FTP-PATH" VALUE="Not in use for application jobs"/>
<AUTOEDIT2 NAME="%%FTP-USE_DEF_NUMRETRIES" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-RPF" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-CLEAR_ALL" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-CONNTYPE2" VALUE="FTP"/>
<AUTOEDIT2 NAME="%%FTP-CONNTYPE1" VALUE="LOCAL"/>
<AUTOEDIT2 NAME="%%FTP-LHOST" VALUE="Local"/>
<AUTOEDIT2 NAME="%%FTP-RHOST" VALUE="hdq-nt164"/>
<AUTOEDIT2 NAME="%%FTP-LPASSIVE" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-RPASSIVE" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD2" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD3" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD4" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-UPLOAD5" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRANSFER_NUM" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TYPE1" VALUE="A"/>
<AUTOEDIT2 NAME="%%FTP-TYPE2" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE3" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE4" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-TYPE5" VALUE="I"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-MINSIZE5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TIMELIMIT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-UNIQUE1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-IF_EXIST5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-SRCOPT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-DSTOPT5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME1" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME2" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME3" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME4" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-ABSTIME5" VALUE="0"/>
<AUTOEDIT2 NAME="%%FTP-TRIM1" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM2" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM3" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM4" VALUE="1"/>
<AUTOEDIT2 NAME="%%FTP-TRIM5" VALUE="1"/>
</JOB>
<JOB
问候,斯里拉姆.V
答案1
我真的不明白为什么您想要为每个 FTP 服务器地址解析整个 XML 文件一次。提取出来会更有意义全部服务器名称并循环读取它们:
xmlstarlet sel -t -v '//JOB/AUTOEDIT2[@NAME="%%FTP-RHOST"]/@VALUE' -nl file.xml |
while IFS= read -r ftpserver; do
# do things with "$ftpserver"
done
如果您需要确保只获得前 16 个工作:
xmlstarlet sel -t -v '//JOB[position()<=16]/AUTOEDIT2[@NAME="%%FTP-RHOST"]/@VALUE' -nl file.xml |
while IFS= read -r ftpserver; do
# do things with "$ftpserver"
done
代码中的主要问题是您尝试在单引号字符串中使用 shell 变量。 shell 不会扩展单引号字符串中的变量。