为什么 printf 不转义换行符?

Ada*_*dam 7 bash newlines printf

$ printf "hi"
hi$ printf "hi\n"
hi
$ printf "hi\\n"
hi
Run Code Online (Sandbox Code Playgroud)

为什么最后一行不打印hi\n

Jde*_*eBP 32

printf您所提供的论点printf无关,而与此无关。

在双引号字符串,外壳变成\\\。因此,您提供的参数printf实际上是hi\nprintf然后当然会对其进行自己的转义序列处理。

在双引号字符串中,\shell执行的转义仅限于影响 ␊ \`$、 和"字符。你会发现它\n被传递给了printf原样。因此,您所提出的论点printf实际上hi\n 又是

将转义序列放入格式字符串时要小心printf。 在Single Unix Specification 中只有一些定义了含义。 例如,已定义,但实际上并非如此。\n\c

进一步阅读

  • 将格式字符串放在单引号中通常是最简单的。这可以防止 shell 处理所有转义字符,并将其留给 `printf`。如果您想在格式字符串中使用文字单引号,则例外。 (3认同)
  • 换句话说,您需要双重逃避您的强烈反对,因为它们要经过两轮插值,shell 的和 printf 的。`printf "hi\\\\n"` 将打印单个文字反斜杠。 (2认同)
  • @BallpointBen 有 3 个反斜杠就足够了,因为外壳会使第三个不受影响。对于shell,`\n` 与`\\n` 相同,因此`\\\n` 与`\\\\n` 相同。老实说,最好只使用单引号来避免这种 shell 行为。 (2认同)

Kus*_*nda 15

在双引号内,\\n是一个转义(引用)反斜杠后跟一个n. 这是考虑到printf作为\nprintf将输出一个换行符。

在双引号(仍然)中,\n是字符串\n. 同样,printf接收一个\n字符串并打印一个换行符。

在双引号,反斜杠是特殊在前一个反斜杠,换行,或任何时候$`"。“特殊”的意思是去掉下一个字符的特殊含义。如果反斜杠位于任何其他字符之前(n例如),那么它只是一个反斜杠字符。

这在POSIX 标准中有解释。

\nprintf格式字符串打印,请使用printf '\\n'printf "\\\\n",或使用printf '%s' '\n'

通常,printf格式字符串应该用单引号引起来,并且任何变量数据都应该作为要插入到格式字符串中的附加参数给出:

printf 'This is how you write a newline: %s\n' '\n'
Run Code Online (Sandbox Code Playgroud)