我对shell脚本很陌生,需要制作一个脚本来检查不同xml文件和不同xml层次结构中的xml标记,并检查不同文件中的版本是否匹配。
但还有一个额外的步骤,我只需要这个标签中的版本号,有些标签可能有更多信息(参见示例-快照、发布(。
我对此很陌生,我已经使用了这个sed命令来获得版本,但不能再进一步了。。。。
成功与失败示例:
Hello, I am quite new to shell scripting and need to make a script that checks xml tag within diferent xml files and diferent xml hierarchy and checks if version matches in different files.
但还有一个额外的步骤,我只需要这个标签中的版本号,有些标签可能有更多信息(参见示例-快照、发布(。
我对此很陌生,我已经使用了这个sed命令来获得版本,但不能再进一步了。。。。
成功与失败示例:
示例1-处理
File1.xml
<project>
<version>1.2.4-SNAPSHOT</version>
</project>
File2.xml
<project>
<parent>
<version>1.2.4</version>
</parent>
</project>
File3.xml
<project>
<parent>
<child>
<version>1.2.4-RELEASE</version>
</parent>
</child>
</parent>
</project>
OUTPUT - Versions Match - 1.0.4
示例2-错误
File1.xml
<project>
<version>1.2.4-SNAPSHOT</version>
</project>
File2.xml
<project>
<parent>
<version>2.2.2</version>
</parent>
</project>
File3.xml
<project>
<parent>
<child>
<version>1.2.2-RELEASE</version>
</parent>
</child>
</parent>
</project>
OUTPUT - Version Mismatch - Check Version
由于您处理的是xml文件,因此应该使用适当的xml解析器读取文件并使用xpath进行搜索。
顺便说一句,File3.xml(在这两种情况下(的格式都不好。因此,例如,假设这个特定的文件内容是:
<project>
<parent>
<child>
<version>1.2.2-RELEASE</version>
</child>
</parent>
</project>
例如,您可以使用xmlstarlet:
xmlstarlet sel -T -t -m "//project//version" -v . File3.xml
或者xidel(我个人更喜欢它,因为它支持xpath>1.0(:
xidel File3.xml -e '//project//version'
在任何一种情况下,输出都应该是
1.2.2-RELEASE
#!/bin/bash
VERSIONS=( $(cat file*.xml | grep -E "^<version>.*</version>$" | cut -d '>' -f 2 | cut -d '<' -f1 | cut -d '-' -f1) )
UNIQUE_VERSION=($(echo "${VERSIONS[@]}" | tr ' ' 'n' | sort -u))
if [ "${VERSIONS[0]}" == "${VERSIONS[1]}" ] && [ "${VERSIONS[1]}" == "${VERSIONS[2]}" ];
then
echo "Versions are the same. $UNIQUE_VERSION"
exit 0
else
echo "ERROR: Versions do not match. $UNIQUE_VERSION"
exit 1
fi
cat
文件(假设存在命名模式并且文件直接相同(
使用grep
和cut
筛选版本
仅使用sort -u
获取唯一值
命令的输出保存到数组VERSIONS=( $(command) )
中
比较数组中的值,如果它们匹配或不包括唯一版本号,则输出消息。
成功时输出:Versions are the same. 1.2.4
失败时输出:ERROR: Versions do not match. 2.2.2