【问题标题】:linux. how to preserve lines when setting content of file to environment variable?linux。将文件内容设置为环境变量时如何保留行?
【发布时间】:2012-09-15 21:15:45
【问题描述】:

我有一个包含几行的文件。 在 shell 中使用 cat/more/less [file] 时,
内容逐行显示

执行以下命令时:

temp=`cat [file]`
echo $temp

内容显示在一行中。

有没有办法在设置环境变量时保留行尾然后回显它?

谢谢

【问题讨论】:

  • temp 是一个变量。它可能在环境中,也可能不在环境中,其状态与问题无关。

标签: linux shell environment-variables newline


【解决方案1】:

是的:

temp=`cat [file]`
echo "$temp"

魔法就在$temp 周围的引号中;没有它们,echo 会得到这些参数:

echo line1\nline2\nlin3

shell 解析算法会在空白处分割命令行,所以echo 看到三个参数。如果您引用变量,echo 将看到一个参数,并且 shell 解析不会触及引号之间的空格。

【讨论】:

    【解决方案2】:

    这是一个非常精确的答案:将进程替换为变量将不会保留:

    • 任何 ASCII NUL
    • 任意数量的尾随换行符

    只有后者可以解决:

    temp=$(realprocess; echo x)  ## Add x to the end to preserve trailing newlines
    temp=${temp%x}  ## Remove the x again (keeping originally trailing newlines)
    

    如果要显示变量的真实内容,请使用printfecho 添加了一个额外的换行符,并且不可靠(例如,当输入以字符串 -n 开头时)。

    在任何情况下,请始终引用您的变量,否则 shell 会将它们在空格上拆分为任意数量的参数!

    printf %s "$temp"
    

    通常,将文件的完整内容保存在 shell 变量中并不是您想要的。有相关文件。

    【讨论】:

      【解决方案3】:

      如果我执行以下操作,则会保留换行符:

      echo a >> test
      echo b >> test
      temp=`cat test`
      echo $temp
      

      【讨论】:

      • 如上所述,如果要保留换行符,则需要在访问变量时引用它们。您应该将最后一行 (echo $temp) 更改为 (echo "$temp") ,然后它会按照您的建议工作。但是,如果您在另一个环境或程序中访问文件“test”(例如,Windows 的 cmd.exe 提示:您可以键入“type test”),则换行符会保留在 the_file 中,但上面的问题询问如何让它与 linux 'echo' 命令一起工作...... echo 将这些行推到一起,就像使用了行继续符()......顺便说一句,我没有反对你 :)
      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2020-10-22
      • 2020-01-12
      相关资源
      最近更新 更多