Shell 如何将环境变量传递给传递给xmllint的命令?
我正试图使用Shell 如何将环境变量传递给传递给xmllint的命令?,shell,sed,environment-variables,Shell,Sed,Environment Variables,我正试图使用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' 我正在
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\u source\u typ
是一个变量,用于从shell参数中获取值,即“sqlserver”
。但是上面的语法没有给出任何输出
为什么这不起作用,我怎样才能修复它
我的config.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>
192.168.0.1
2000
样品
样品
192.168.0.2
2000
样品
样品
我通过以下几点实现了这一点:
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
我不太关心如何使值占位符使用$symbol,我可能最终会回来编辑它
编辑:这是一个带$的,但您需要用一个:
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'
正如我刚刚发现的,您需要在单引号(')之间设置环境变量 因此,以下措施应该有效:
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'