0

我需要加载一个 XML 文件并遍历其中的节点列表,以使用每个节点的属性作为脚本的参数为每个节点执行一个 shell 脚本。有任何想法吗?任何帮助都感激不尽。

XML 文件示例:

<Config>
    <FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>60</TIMEOUT>
<COMMAND>/opt/test1.sh</COMMAND>

<FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>30</TIMEOUT>
    <COMMAND>/opt/test2.sh</COMMAND>
</Config>
4

1 回答 1

1

最简单的解决方案是编辑 xml 文件:在另一个标签中包含频率/超时/命令标签:

xmlstarlet sel -t -m /Config/x -v FREQUENCY -o : -v TIMEOUT -o : -v COMMAND -nl <<END
<Config>
  <x>
    <FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>60</TIMEOUT>
    <COMMAND>/opt/test1.sh</COMMAND>
  </x>

  <x>
    <FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>30</TIMEOUT>
    <COMMAND>/opt/test2.sh</COMMAND>
  </x>
</Config>
END
EVERYTIME:60:/opt/test1.sh
EVERYTIME:30:/opt/test2.sh

否则,假设您的 xml 文件如此简单(并且我讨厌在 xml 上使用文本处理工具):

awk -F '[<>]' -v OFS=: '
    $2 == "FREQUENCY" {f=$3} 
    $2 == "TIMEOUT" {t=$3} 
    $2 == "COMMAND" {c=$3}
    f && t && c {print f,t,c; f=t=c=""}
' <<END 
<Config>
    <FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>60</TIMEOUT>
    <COMMAND>/opt/test1.sh</COMMAND>

    <FREQUENCY>EVERYTIME</FREQUENCY>
    <TIMEOUT>30</TIMEOUT>
    <COMMAND>/opt/test2.sh</COMMAND>
</Config>
END
EVERYTIME:60:/opt/test1.sh
EVERYTIME:30:/opt/test2.sh

无论哪种情况,您都可以将输出通过管道传输到:

... | while IFS=: read freq timeout cmd; do
    something with "$freq" "$timeout" "$cmd"
done
于 2014-08-28T10:46:14.360 回答