【问题标题】:Losing newline after assigning grep result to a shell variable将 grep 结果分配给 shell 变量后丢失换行符
【发布时间】:2009-04-16 00:59:36
【问题描述】:
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;

在命令行上运行时,通常 grep 会在单独的行中显示每个匹配项。但是,在上述脚本中,分隔每个匹配项的换行符消失了。有谁知道如何保留换行符?

【问题讨论】:

标签: shell


【解决方案1】:

您不会在作业中丢失它,而是在回声中丢失它。如果您满足以下条件,您可以清楚地看到这一点:

echo "${out}"

您会看到以下脚本的类似效果:

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

哪个输出:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

而且,与您的问题无关,但我还是想提一下,我更喜欢使用 $() 构造而不是反引号,只是为了能够嵌套命令的额外好处。所以你的脚本行变成:

out=$(grep apache README)

现在看起来可能没有任何不同(实际上并没有),但它可以实现更复杂的命令,例如:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)

【讨论】:

  • 我不知道你可以用 $() 做到这一点......在这里一直学习新东西。
  • 你可以不使用 expr 来做数学。只需使用双括号:$((7 + 2))
  • 实际上,从现在开始,我可能会用我所有的答案来尝试 - 附加一个(并不总是完全)相关的 sn-p 用于群体的教育:-)
  • 好点子,巴里,但这只是嵌套的一个例子——我的例子生成技能似乎随着年龄的增长(和/或酒精:-)而退化。
  • 我自己刚刚发现了 $(()) 的事情。
【解决方案2】:

将 $out 放在引号中:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";

【讨论】:

    【解决方案3】:

    在 bash 中引用变量会保留空格。

    例如:

    #!/bin/bash
    var1="A B  C   D"
    echo $var1   # A B C D
    echo "$var1" # A B  C   D
    

    由于换行符是空格,它们被“删除”

    【讨论】:

      【解决方案4】:

      将其他答案组合成一个衬里:

      echo "($(grep apache README))"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-16
        • 2013-05-05
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 2013-04-25
        相关资源
        最近更新 更多