【问题标题】:do not show single quotes for a variable shell script [duplicate]不显示变量 shell 脚本的单引号 [重复]
【发布时间】:2018-02-05 16:55:35
【问题描述】:

我有一个变量userName="testUser",它进入另一个名为Data 的字符串。 我目前不知道如何摆脱唱歌的报价。如果我不给出单引号,则 userName 将被视为字符串文字。

Data="<Resource  name="\"jdbc/datSource"\" auth="\"Container"\" \n factory="\"org.apache.tomcat.jdbc.pool.DataSourceFactory"\" driverClassName=\"\oracle.jdbc.driver.OracleDriver\"\ username=\"\'${userName}'\"\ />" 

最终我得到的是

name="jdbc/datSource" auth="Container" 
 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="oracle.jdbc.driver.OracleDriver" username="'testUser'" />

只需要打印username="testUser"

谢谢

【问题讨论】:

  • 看起来您正在尝试使用 ES6 模板文字 (${...}),并且要使它们正常工作,您需要使用 ES6 反引号...developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 如果我是,请告诉我没有抓住重点。
  • 如果我不提供单引号,userName 将被视为字符串文字。 你使用什么 shell?它在bash 中对我来说很好,没有单引号。
  • 我正在使用 gitbash

标签: shell echo


【解决方案1】:

看起来问题在于您正在转义 $ 字符。 如果您在第一个单引号之前删除单引号和 \,它将起作用。

Data="&lt;Resource name="\"jdbc/datSource"\" auth="\"Container"\" \n factory="\"org.apache.tomcat.jdbc.pool.DataSourceFactory"\" driverClassName=\"\oracle.jdbc.driver.OracleDriver\"\ username=\"${userName}\"\ /&gt;"

【讨论】:

    【解决方案2】:

    如果你使用外部单引号,你的引用会少很多不必要的复杂,并且只在你希望扩展的特定字符串周围切换到双引号:

    userName="Test User"
    Data='
    <Resource  name="jdbc/datSource" auth="Container"
               factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               username="'"${userName}"'" />
    '
    
    echo "$Data"
    

    ...正确发出:

    <Resource  name="jdbc/datSource" auth="Container"
               factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               username="Test User" />
    

    但是,您永远不应该这样做。使用真正的 XML 感知工具(即。 XMLStarlet) 生成或编辑 XML。

    如果您使用的是 XMLStarlet,例如,您可以运行以下代码:

    xmlstarlet ed \
      -u '//Resource[@name='jdbc/datSource']/@username' \
      -v "$userName" \
      <in.xml >out.xml
    

    ...将username 更改为现有文档中名称为jdbc/datSourceResource

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2021-08-22
      • 2017-12-16
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多