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

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

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

答案1

man echo1开始:

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

man printf1开始:

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

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

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

$ echo -en "\0101" | od -A n -t o1
 101

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

$ printf "\0101" | od -A n -t o1
 010 061

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


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

相关内容