最简单的解决方案是编辑 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