【问题标题】:Shell Script - Check if XML tags match versionShell 脚本 - 检查 XML 标记是否与版本匹配
【发布时间】:2022-01-01 23:23:05
【问题描述】:

我对 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 文件中,是否只有一个 &lt;project&gt; 元素和一个 &lt;version&gt; 子元素?
  • 嗨@JackFleeting 感谢您的回复。我要比较的版本包含在每个 xml 的结构中,但是是的,每个只有 1 个元素。
  • @JackFleeting XML 结构对于每种类型的文件(1、2、3)总是相同的,我不需要它是动态的。

标签: xml shell validation


【解决方案1】:

由于您正在处理 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

【讨论】:

    【解决方案2】:
    #!/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 文件(假设有一个命名模式并且文件直接在同一个)
    使用 grepcut 过滤版本
    仅使用sort -u获取唯一值
    命令的输出保存到数组VERSIONS=( $(command) )

    比较数组中的值,如果它们匹配或不包含唯一版本号,则输出消息。

    成功时输出:
    Versions are the same. 1.2.4
    失败时输出:
    ERROR: Versions do not match. 2.2.2

    【讨论】:

    • 非常感谢你,我今天会测试一下!!
    • 不客气。我希望这个对你有用。顺便说一句,else echo msg 只会打印其中一个唯一版本。如果您有例如:1.2.4-SNAPSHOT 2.2.2 1.2.4-RELEASE 它表明2.2.2奇数一个,但如果所有三个不同,它只会打印最后一个版本号,因此如果不符合您的需要,您可以从 else 回显消息中删除 $UNIQUE_VERSION
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-08-05
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多