为什么双引号会影响Linux中这些回声语句的打印



我正在捕获ps aux的输出:

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

当我回声时,看起来像

echo $current_processes
19984 10089 17784

当我 echo加上双引用时,看起来像这样:

echo "$current_processes"
19984 
10089
17784    

当我使用双引号时,为什么将它们放在新线上,而不是在没有双引号的情况下?

效果来自外壳。没有双引号,壳将用空格代替新线,标签和空间。您可以用双引号避免这种替代。有关更多详细信息,请参见bash(1)的MAN页面中的Word Splitting部分:

单词拆分

外壳扫描参数扩展,命令替代和算术扩展的结果 单词分裂的双引号。

外壳将IFS的每个字符视为定界符,然后将 其他扩展为这些字符的单词的结果。如果IFS 是不设置的,否则其值恰好是默认值, 那么任何IFS字符的序列都用于界定单词。如果IFS 除默认值外,还有一个值 角色空间和选项卡在开头和结尾被忽略 单词,只要whitespace字符在ifs的值中(一个 IFS whitespace字符)。IF中的任何角色都不是白色 空间,以及任何相邻的ifs whitespace字符,划定a 场地。一系列ifs whitespace字符也被视为 定界符。如果IF的值为null,则不会发生单词分配。

您可以使用echo "$IFS" | xxd看到IFS的内容。它将向您展示

00000000: 2009 0a0a                                 ...

表示空间(0x20),TAB(0x09)和newline(0x0a)。第二个0x0a来自Echo命令。

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

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

,但我不建议这样做。

最新更新