我试图用 来结束一行\
,并在新行上添加其他内容。起初我这样做了,但它只打印了 \n:
$ echo -e "Test\\\nNewline"
Test\nNewline
我尝试过这种方法但它在反斜杠后面添加了一个空格:
$ echo -e "Test\\ \nNewline"
Test\
Newline
我怎样才能做到这一点,以便后面没有空格\
?
更新:现在没有问题了,因为我看到再添加两个斜线就可以得到我想要的结果。但我仍然想知道为什么会这样?
$ echo -e "Test\\\\\nNewline"
Test\
Newline
答案1
Bash 参考手册:双引号:在双引号中,后跟下列字符之一(包括反斜杠)的反斜杠将被删除。
因此,在作为参数传递给命令之前,"Test\\\\\nNewline"
被替换为。Test\\nNewline
echo
为了证明这一点:
$ echo -e "Test\\\\\nNewline"
Test\
Newline
$ echo -e 'Test\\\nNewline'
Test\
Newline
答案2
Steven 已经解释了为什么需要这么多反斜杠;我想列出一些可能更好的方法来做同样的事情。首先,使用单引号而不是双引号可以跳过额外的转义解释/删除级别:
$ echo -e "Test\\\nNewline"
Test\nNewline
$ echo -e 'Test\\\nNewline'
Test\
Newline
其次,我不建议使用echo
这样的方法,因为它的不同版本的行为完全不同:有些版本\n
即使没有选项也会解释字符串中的转义序列(如) -e
,有些版本会将“-e”打印为其输出的一部分,等等。这是一个使用 /bin/echo 而不是 bash 内置版本的示例:
$ /bin/echo -e 'Test\\\nNewline'
-e Test\\\nNewline
...这是在 OS X v10.10.4 上;它可能在您的操作系统和/或版本上有所不同。任何时候,如果您希望转义解释和/或省略最后的换行符具有可预测的行为,我建议您使用printf
而不是echo
。这有点复杂: 的第一个参数printf
是格式字符串,其中转义是总是解释,并且还可以包括%
用于添加剩余参数的序列(其中转义序列是不是解释)。此外,printf
不会自动在末尾添加换行符,您必须明确添加换行符。以下是使用 打印所需内容的几种方法printf
:
$ printf 'Test\\\nNewline\n' # note explicit final newline
Test\
Newline
$ printf '%s\n' 'Test\' 'Newline' # Escape is interpreted in the format string, but not in the second argument
Test\
Newline