Hun*_*nle 8 unix linux shell ps echo
我正在捕获输出ps aux:
current_processes=`ps aux | grep "tempdir" | tail -3`
Run Code Online (Sandbox Code Playgroud)
当我回应它时,它看起来像这样
echo $current_processes
19984 10089 17784
Run Code Online (Sandbox Code Playgroud)
当我echo加双引号时,它看起来像这样:
echo "$current_processes"
19984
10089
17784
Run Code Online (Sandbox Code Playgroud)
当我使用双引号但没有双引号时,为什么将它们放在新行上?
效果来自外壳。如果没有双引号,shell 会用空格替换换行符、制表符和空格。您可以使用双引号避免这种替换。有关更多详细信息,请参阅Word Splitting手册页中的部分:bash(1)
分词
shell 扫描未出现在双引号内的参数扩展、命令替换和算术扩展的结果以进行分词。
shell 将 IFS 的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。如果 IFS 未设置,或其值恰好为默认值,则任何 IFS 字符序列都可用于分隔单词。如果 IFS 具有默认值以外的值,则只要空白字符位于 IFS 值(IFS 空白字符)中,单词开头和结尾处的空白字符 space 和 tab 序列就会被忽略。IFS 中非 IFS 空白的任何字符以及任何相邻的 IFS 空白字符共同界定字段。IFS 空白字符序列也被视为分隔符。如果IFS的值为空,则不会发生分词。
IFS你可以看到with的内容echo "$IFS" | xxd。它会告诉你
00000000: 2009 0a0a ...
Run Code Online (Sandbox Code Playgroud)
这意味着空格 (0x20)、制表符 (0x09) 和换行符 (0x0a)。第二个 0x0a 来自 echo 命令。
您可以通过设置IFS为空字符串来避免这种替换:
IFS=""
echo "$current_processes"
19984
10089
17784
Run Code Online (Sandbox Code Playgroud)
但我不会推荐这个。