【问题标题】:Trying to identify release version of an application reading a xml file using shell script尝试使用 shell 脚本识别读取 xml 文件的应用程序的发布版本
【发布时间】:2018-05-15 17:01:11
【问题描述】:

试图识别读取 xml 文件的应用程序的发布版本。

文件:/u01/app/inventory/ContentsXML/comps.xml

grep -Po '(?<=VER=)[^ ]*' /u01/app/inventory/ContentsXML/comps.xml |head -1 |sed -e 's/^"//' -e 's/"$//'
11.13.17.08.0

另一个版本

grep -Po '(?<=VER=)[^ ]*' /u01/app/inventory/ContentsXML/comps.xml |head -1 |sed -e 's/^"//' -e 's/"$//
11.12.0.0.0

这就是它在脚本中的使用方式(代码 sn-p)

REL_VER=`grep -Po '(?<=VER=)[^ ]*' /u01/app/inventory/ContentsXML/comps.xml |head -1 |sed -e 's/^"//' -e 's/"$//'`
if [[ $REL_VER =~ ^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0]{1,}$ ]];  then
    echo "Identified as Release 13" | tee -a ${OUT_FILE}
    ${ROOT}/r13patch.sh >>${OUT_FILE} 2>&1
else
    echo "Not a Release 13 Skipping Patching" | tee -a ${OUT_FILE}

在某些情况下,它会准确检测版本并且安装脚本正在启动,但在某些情况下,它不是,例如:11.12.1.0.0

请求专家帮助优化脚本中的变量匹配部分,以便必须将 11.13.17.08.0 和 11.13.x.x.x 的任何其他组合标识为版本 13,而所有其他版本必须视为不同的版本。例如,任何类似于 11.11.x.x.x 或 11.12.x.x.x 或 11.10.x.x.x 12.11.x.x.x 的值都应转到脚本中的“不是第 13 版跳过补丁”。

感谢您的回答

和cut一样用,但是这里忘记更新了,

REV_FILE1=/u01/app/inventory/ContentsXML/comps.xml
REV_FILE2=/u01/APPLTOP/app/inventory/ContentsXML/comps.xml  
if [ -f ${REV_FILE1} ]; then
REL_VER=`grep -Po '(?<=VER=)[^ ]*' ${REV_FILE1} |head -1 |sed -e 's/^"//' -e 's/"$//'|cut -d"." -f1-2`
elif [ -f ${REV_FILE2} ]; then
REL_VER=`grep -Po '(?<=VER=)[^ ]*' ${REV_FILE2} |head -1 |sed -e 's/^"//' -e 's/"$//'|cut -d"." -f1-2`
else
   log_warn "Unable to identify release version"
fi
if [[ ! -z ${REL_VER} && ${REL_VER} == 11.13 ]];  then
    log_info "Identified as R13"
    ${ROOT}/r13patch.sh >>${OUT_FILE} 2>&1
    if [ $? -eq 0 ] ; then
        log_info "R13 APP Patching finished successfully"
    else
        log_crit "R13 APP Patching failed"
    fi
else
    log_info "Not a Release 13 Skipping Patching"

【问题讨论】:

  • 能把这个xml文件的相关内容贴出来吗?
  • 您能否提供一个实际完整的文件示例,可以使用真正的 XML 解析器读取(因此可以使用 xmlstarlet、xmllint、xsltproc 和其他命令行工具构建答案)真的懂XML)?
  • 顺便说一句——全大写变量名用于 shell 和环境变量对 shell 本身或 POSIX 定义的工具有意义。 POSIX 标准保留小写名称供应用程序使用,因此脚本可以使用小写名称,而不必担心意外修改 shell 行为;见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段。

标签: xml bash sed grep cut


【解决方案1】:

正如他们所说,您对 XML 文件的解析非常勇敢。它可能会起作用,因为您知道它是如何创建的,但它也与问题无关。

version=$(echo REL_VER| cut-d. -f1)
release=$(echo REL_VER| cut-d. -f2)
#etcetera

将为您提供版本号中的不同字段。

【讨论】:

  • 和cut一样用,这里忘记更新了,
  • @charles-duffy 感谢您的回答/建议。和cut一样用,但是这里忘记更新了,问题里更新了新代码sn-p。
【解决方案2】:

问题中没有足够的信息来帮助解析,但是一旦从文件中解析出版本,如何最好地识别版本很容易:使用case 语句。

case $version in
  11.13.*) echo "Release 13; proceeding" >&2 ;;
  *)       echo "Release not from 11.13.x series; aborting"; exit 1;;
esac

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多