我正在捕获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
,但我不建议这样做。