字符转义和回显命令

字符转义和回显命令

有简单的 echo 命令:

echo "\n"

echo "\\n"

两种结果都相同

\n

有人可以详细解释一下 bash 是如何处理这样的命令(逐个字符)的,以及为什么两种情况下的结果相同吗?

答案1

简短的回答是,对或 来说\并不总是特殊的。双引号保留其中所有内容的文字字符串值,但 、 、 和有时 除外。在双引号之外,对 bash 来说始终是特殊的:它保留以下字符的文字字符串值。在引号内,反斜杠只有在后跟五个字符之一时才是特殊的:、、、或换行符。在前四种情况下,它保留以下字符的文字字符串值。对于echo 版本,除非提供了标志,否则永远不会是特殊的。bashecho$`\!\\$`"\bash\-e

那么,在你的两种情况下,发生了什么:

echo "\n"

在这种情况下,\后面不是上述五个字符之一,因此被视为其文字字符串值。

echo "\\n"

在这种情况下,第一个后面\跟着第二个\。第一个转义了第二个,因此它被解释为其文字字符串值。这在这里毫无用处,因为它将被解释为其文字字符串值反正,但是如果您想在一行末尾打印一个反斜杠,它可能会很有用,例如:

echo "This is a single backslash:\\"

否则,反斜杠将被 shell 解释为转义"

bash所有这些信息都可以从手册页中关于双引号的部分找到,这里

答案2

单个\保留其后紧接着的字符的文字字符串值。

因此在这种情况下:

echo "\\n"

第一个是保留位于 之前的\字符串文字。如果您输入以下内容...\"n"

echo "\"

...您需要完成该命令,因为解释器不会将其"\"视为字符串文字,而是等待用户输入来转义“下一个”字符。

但是,如果\包含在单引号内,则不会等待转义字符,因为单引号本身会保留其所括住的文字字符。

例如:echo '\'

这会将反斜杠打印为字符串文字而不是转义字符,因此解释器不会等待用户包含字符。

该信息以及更多信息都包含在 bash 手册页中。

相关内容