printf 和 echo -e 给出不同的结果

Loc*_*ost 0 ubuntu echo ascii escape-characters printf

我使用\0n转义序列与echo -eprintf其中n是要被打印的ASCII字符的八进制值。当我使用该语句时echo -e "\0101",shell 正在打印字符,A但是当我使用printf "\0101"shell 时,正在打印1这是我提供的八进制数的最低有效位,但是如果我0在开头删除并使用命令,因为printf "\101"A按预期正确打印。所以我的疑问是为什么这个特定的转义序列会有如此大的差异,我尝试了许多其他转义序列,但它们使用 echo 和 printf 都给出了相同的结果。我正在使用Ubuntu并且目前正在研究bash.

fra*_*san 5

man echo1 :

\0NNN 带有八进制值的字节NNN(1 到 3 位)

man printf1 :

\NNN 八进制值的字节NNN(1 到 3 位)

这两个命令不接受八进制序列的相同格式。

您可以轻松检查它们的实际输出是否有很大不同:

$ echo -en "\0101" | od -A n -t o1
 101
Run Code Online (Sandbox Code Playgroud)

echo实际上是打印预期的单个字符A

$ printf "\0101" | od -A n -t o1
 010 061
Run Code Online (Sandbox Code Playgroud)

printf,另一方面,将其\010视为字符转义序列,随后将其1视为文字字符,它只是复制到输出中。
因此,它打印 a <backspace>(没有可见效果,是字符串的第一个字符),其八进制表示为010,后跟未解释的1


1准确地说,您正在运行的命令很可能是 Bash 内置命令,而不是由man(可能来自coreutils)描述的命令。但两者help echohelp printf确认man的语法或直接引用它。