,最简单的解决方案涉及一个编辑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
你就不能让2线输入的一个普通的文本文件的进程,用'while read line';做eval $行;完成<$ file'?祝你好运。 – shellter 2014-08-28 02:43:56