【问题标题】:Why can't I generate newlines in quotes in bash?为什么我不能在 bash 的引号中生成换行符?
【发布时间】:2016-03-24 23:38:59
【问题描述】:

无论我做什么,我都无法让引号中的换行符保留在输出中。我是什么做的?这是 OS X 中的 bash。我的代码在这里:Gist

read -d '' sbt_text=$(cat <<"EOF"
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M";
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
EOF
)

echo $sbt_text

#!/bin/bash > SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"; > java -jar /sbt-launch.jar ""

【问题讨论】:

    标签: bash newline quote


    【解决方案1】:

    你可能想要的是这个:

    IFS= read -d '' -r sbt_text <<"EOF"
    #!/bin/bash
    SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M";
    java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
    EOF
    
    echo "$sbt_text"
    

    虽然您的read 命令无法正常工作,但不能双引号 $sbt_text 将始终执行word splitting(还有pathname expansion (globbing)) ,当传递给echo 时,意味着任何内部空格都被规范化为一个单个空格

    为了在类似 POSIX 的 shell 中按原样保留变量的值 - 不使其受到上述 shell expansions 的约束 - 您必须双引号

    关于read 命令,请注意:

    • -r 可防止对输入中的 \ 实例进行通常的意外解释。
    • 添加 IFS= 可确保 here-document 中的每一行相对于空格保持原样(不修剪前导和尾随空格)
    • 不需要command substitution ($(...)) 和cat,因为&lt;&lt; (here-document) 直接提供标准输入,这是read 的输入。
      • 通过在您的read 命令中使用sbt_text=$(...),您实际上生成了命令替换的输出 ($(...))(最终无效)变量名的一部分,而不是提供 input,导致read 仍在等待标准输入。
      • 使用 just 赋值 sbt_text=$(cat &lt;&lt;"EOF" ...)(不带 read)几乎可以满足您的需求(尽管以调用外部实用程序 cat 为代价),除了命令替换会删除任何尾随的换行符。

    【讨论】:

      【解决方案2】:

      你应该引用你的变量

      echo "$sbt_text"
      

      这可以防止 Bash 在替换您的变量(参数扩展)后进行 分词(以及 globbing,即扩展通配符,例如 *?)。请注意,为read 设置IFS 不会阻止echo 命令行上的分词。试试这个好玩:

      ( IFS= ; echo $sbt_text )
      

      对比

      IFS= echo $sbt_text ### won't work
      

      第二个示例不起作用 - 子 shell (( )) 在这里是必需的,因为 IFS 由调用 shell 解释以进行分词,而在问题的代码示例中由 read 解释。

      当然这也有效(但“毁了”你的IFS):

      IFS= ; echo $sbt_text
      

      【讨论】:

      • 值得指出的是,清除 IFS 不足以使 echo $fooecho "$foo" 完全等效:比较 foo='*' 时的行为。
      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2015-11-02
      相关资源
      最近更新 更多