为什么双引号会影响linux中这些echo语句的打印?

时间:2017-09-07 01:54:36

标签: linux shell unix echo ps

我正在捕获ps aux的输出:

current_processes=`ps aux | grep "tempdir" | tail -3`

当我回应它时,它看起来像这样

echo $current_processes
19984 10089 17784

当我echo加双引号时,它看起来像这样:

echo "$current_processes"
19984 
10089
17784    

为什么我在使用双引号时将这些放在新行上但在没有双引号时却没有?

1 个答案:

答案 0 :(得分:3)

效果来自shell。如果没有双引号,shell会用空格替换换行符,制表符和空格。您可以使用双引号来避免这种替换。有关详细信息,请参阅Word Splitting手册页中的bash(1)部分:

  

分词

     

shell扫描未在其中发生的参数扩展,命令替换和算术扩展的结果   用于分词的双引号。

     

shell将IFS的每个字符视为分隔符,并将其拆分          其他扩展成为这些字符的单词的结果。如果是IFS          未设置,或其值正好是默认值,          然后任何IFS字符序列用于分隔单词。如果是IFS          具有默认值以外的值,然后是空格的序列          字符空格和制表符在开头和结尾处被忽略          单词,只要空白字符在IFS的值(an          IFS空白字符)。 IFS中任何非IFS白色字符 -          空格,以及任何相邻的IFS空白字符,分隔a          领域。一系列IFS空白字符也被视为一个          分隔符。如果IFS的值为null,则不会发生分词。

您可以使用IFS查看echo "$IFS" | xxd的内容。它会告诉你

00000000: 2009 0a0a                                 ...

表示空格(0x20),制表符(0x09)和换行符(0x0a)。第二个0x0a来自echo命令。

您可以通过将IFS设置为空字符串来避免此替换:

IFS=""
echo "$current_processes"
19984 
10089
17784

但我不建议这样做。