私は\0n
エスケープシーケンスを使用します。echo -e
ここでprintf
、nは印刷するASCII文字の8進数値です。そのステートメントを使用すると、echo -e "\0101"
シェルは文字を印刷しますA
が、シェルを使用したときに指定した8進数の最下位ビットをprintf "\0101"
印刷しますが、最初にそれらを削除してコマンドを使用すると、期待どおりに正しく印刷されます。だから私の質問は、なぜこの特定のエスケープシーケンスがそれほど大きな違いを生むのかということです。私は他の多くのエスケープシーケンスを試しましたが、echoとprintfに対して同じ結果を提供します。を使用しており、現在作業中です。1
0
printf "\101"
A
Ubuntu
bash
ベストアンサー1
man echo
1から始まる:
\0NNN
8進値を含むバイトNNN
(1〜3桁)
man printf
1から始まる:
\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 printf
man