【问题标题】:How to pass environment variable to a command passed to xmllint?如何将环境变量传递给传递给 xmllint 的命令?
【发布时间】:2017-12-22 15:30:21
【问题描述】:

我正在尝试使用 xmllint 从 xml 文件中提取 db 元素的 value 属性

我的 XPath 查询需要导航到正确的 dbtype,我希望将其存储在环境变量中

没有环境变量(硬编码),此命令有效

echo 'cat //rdbmsinfo/dbtype[@value="sqlserver"]/db/@value' | xmllint --shell "config.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \ | sed 's/"//g'

我正在尝试使用以下命令:

echo 'cat //rdbmsinfo/dbtype[@value="$ldb_source_typ"]/db/@value' | xmllint --shell "config.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \ | sed 's/"//g'

其中ldb_source_typ 是一个变量,用于从shell 参数中获取"sqlserver" 的值。但是上面的语法没有给出任何输出。

为什么这不起作用,我该如何解决?

我的 config.xml XML 如下所示:

<?xml version="1.0"?>
<rdbmsinfo>
  <dbtype value="sqlserver">
    <db value="sqlsrv1">
      <dbhostip>192.168.0.1</dbhostip>
      <dbhostportno>2000</dbhostportno>
      <dbusername>sample</dbusername>
      <dbpassword>sample</dbpassword>
    </db>
    <db value="sqlsrv2">
      <dbhostip>192.168.0.2</dbhostip>
      <dbhostportno>2000</dbhostportno>
      <dbusername>sample</dbusername>
      <dbpassword>sample</dbpassword>
    </db>
  </dbtype>
  <dbtype value="postgresql">
    <db value="postsql1">
    </db>
  </dbtype>
</rdbmsinfo>

【问题讨论】:

    标签: shell sed environment-variables


    【解决方案1】:

    正如我刚刚发现的,您需要在单引号 ( ' ) 之间设置环境变量。

    所以以下应该可以工作:

    echo 'cat //rdbmsinfo/dbtype[@value="'$ldb_source_typ'"]/db/@value' | xmllint --shell "config.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \ | sed 's/"//g'
    

    【讨论】:

      【解决方案2】:

      我能够通过以下方式做到这一点:

      echo "cat //rdbmsinfo/dbtype[@value="ldb_source_type"]/db/@value" | sed 's/ldb_source_type/"'$SQLSERVER'"/g' | xmllint --shell config.xml| grep -v ">" | cut -f 2 -d "=" | tr -d \ | sed 's/"//g'
      

      产生以下输出:

      sqlsrv1
      -------
      sqlsrv2
      

      我不太关心如何让值占位符使用 $ 符号,我最终可能会回来编辑它。

      编辑:这里有一个 $,但你需要用 : 转义它

      echo "cat //rdbmsinfo/dbtype[@value="\$ldb_source_type"]/db/@value" | sed 's/\$ldb_source_type/"'$SQLSERVER'"/g'| xmllint --shell config.xml| grep -v ">" | cut -f 2 -d "=" | tr -d \ | sed 's/"//g'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-09
        • 2013-12-29
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多