有没有办法在 bash 中回显黑斜杠后跟换行符?

有没有办法在 bash 中回显黑斜杠后跟换行符?

我试图用 来结束一行\,并在新行上添加其他内容。起初我这样做了,但它只打印了 \n:

$ echo -e "Test\\\nNewline" 
Test\nNewline

我尝试过这种方法但它在反斜杠后面添加了一个空格:

$ echo -e "Test\\ \nNewline"
Test\ 
Newline

我怎样才能做到这一点,以便后面没有空格\

更新:现在没有问题了,因为我看到再添加两个斜线就可以得到我想要的结果。但我仍然想知道为什么会这样?

$ echo -e "Test\\\\\nNewline"
Test\
Newline

答案1

Bash 参考手册:双引号:在双引号中,后跟下列字符之一(包括反斜杠)的反斜杠将被删除。

因此,在作为参数传递给命令之前,"Test\\\\\nNewline"被替换为。Test\\nNewlineecho

为了证明这一点:

$ 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

相关内容