Ubuntu

printf 和 echo -e 給出不同的結果

  • April 10, 2019

我正在使用\0n轉義序列,echo -e其中printfn 是要列印的 ASCII 字元的八進制值。當我使用該語句echo -e "\0101"時,shell 正在列印字元A,但是當我使用printf "\0101"shell 時,它正在列印1,這是我提供的八進制數的最低有效位,但如果我0在開始時刪除並使用命令,因為printf "\101"A按預期正確列印。所以我懷疑為什麼這個特定的轉義序列會有這樣的差異,我嘗試了許多其他的轉義序列,但它們對 echo 和 printf 給出了相同的結果。我正在使用Ubuntu並且目前正在使用bash.

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 echo確認help printfmans 的語法或直接引用它。

引用自:https://unix.stackexchange.com/questions/511672