有简单的 echo 命令:
echo "\n"
和
echo "\\n"
两种结果都相同
\n
有人可以详细解释一下 bash 是如何处理这样的命令(逐个字符)的,以及为什么两种情况下的结果相同吗?
答案1
简短的回答是,对或 来说\
并不总是特殊的。双引号保留其中所有内容的文字字符串值,但 、 、 和有时 除外。在双引号之外,对 bash 来说始终是特殊的:它保留以下字符的文字字符串值。在引号内,反斜杠只有在后跟五个字符之一时才是特殊的:、、、或换行符。在前四种情况下,它保留以下字符的文字字符串值。对于echo 版本,除非提供了标志,否则永远不会是特殊的。bash
echo
$
`
\
!
\
\
$
`
"
\
bash
\
-e
那么,在你的两种情况下,发生了什么:
echo "\n"
在这种情况下,\
后面不是上述五个字符之一,因此被视为其文字字符串值。
echo "\\n"
在这种情况下,第一个后面\
跟着第二个\
。第一个转义了第二个,因此它被解释为其文字字符串值。这在这里毫无用处,因为它将被解释为其文字字符串值反正,但是如果您想在一行末尾打印一个反斜杠,它可能会很有用,例如:
echo "This is a single backslash:\\"
否则,反斜杠将被 shell 解释为转义"
。
bash
所有这些信息都可以从手册页中关于双引号的部分找到,这里。
答案2
单个\
保留其后紧接着的字符的文字字符串值。
因此在这种情况下:
echo "\\n"
第一个是保留位于 之前的\
字符串文字。如果您输入以下内容...\
"n"
echo "\"
...您需要完成该命令,因为解释器不会将其"\"
视为字符串文字,而是等待用户输入来转义“下一个”字符。
但是,如果\
包含在单引号内,则不会等待转义字符,因为单引号本身会保留其所括住的文字字符。
例如:echo '\'
这会将反斜杠打印为字符串文字而不是转义字符,因此解释器不会等待用户包含字符。
该信息以及更多信息都包含在 bash 手册页中。