printfとecho -eは異なる結果を提供します。

printfとecho -eは異なる結果を提供します。

私は\0nエスケープシーケンスを使用します。echo -eここでprintf、nは印刷するASCII文字の8進数値です。そのステートメントを使用すると、echo -e "\0101"シェルは文字を印刷しますAが、シェルを使用したときに指定した8進数の最下位ビットをprintf "\0101"印刷しますが、最初にそれらを削除してコマンドを使用すると、期待どおりに正しく印刷されます。だから私の質問は、なぜこの特定のエスケープシーケンスがそれほど大きな違いを生むのかということです。私は他の多くのエスケープシーケンスを試しましたが、echoとprintfに対して同じ結果を提供します。を使用しており、現在作業中です。10printf "\101"AUbuntubash

ベストアンサー1

man echo1から始まる:

\0NNN 8進値を含むバイトNNN(1〜3桁)

man printf1から始まる:

\NNN 8進値を含むバイトNNN(1〜3桁)

これら2つのコマンドは同じ8進数シーケンス形式を受け入れません。

実際の出力が大きく異なることを簡単に確認できます。

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

echo実際に予想される単一文字を印刷しますA

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

printf一方、これを\010文字エスケープシーケンスとして処理し、後続の文字を1リテラル文字として処理し、出力にのみコピーします。
したがって、<backspace>8進表現を使用してa(目に見える効果がなく、文字列の最初の文字)を印刷し、010その後に解釈されていないものを印刷します1


1正確に言えば、実行中のコマンドは、説明されたコマンドではなくman(おそらく出てきた)Bash組み込みコマンドである可能性が高いです。coreutilsただし、どちらも構文をhelp echo確認するか直接引用します。help printfman

おすすめ記事