web-dev-qa-db-ja.com

16進数で二重引用符を使用した場合と使用しない場合のECHOの動作

誰かがechoの動作を理解するのを手伝ってくれますか? Ubuntuで次のコマンドを試しています。

$ echo -e \xaa
xaa
$ echo -e "\xaa"

▒
$

ご覧のように、二重引用符を使用すると、16進数を出力している間、出力はごみになります。 -eは、\nを改行やその他のシーケンスに解釈するのに役立つことがわかっています。 -eオプションを使用したエコーが16進数を処理する方法を理解したいだけです。

2
WebEye

引用符がないと、\xはシェルによって解析されてxになります。

$ printf "%s\n" echo -e \xaa
echo
-e
xaa    
$ printf "%s\n" echo -e "\xaa"
echo
-e
\xaa

man bash 、セクションQUOTINGを参照してください:

   A non-quoted backslash (\) is the escape character.  It  preserves  the
   literal value of the next character that follows, with the exception of
   <newline>.  If a \<newline> pair appears,  and  the  backslash  is  not
   itself  quoted,  the \<newline> is treated as a line continuation (that
   is, it is removed from the input stream and effectively ignored).

あなたのgrepは誤解を招くものです:

$ man echo | grep -o \xHH
xHH

grep -oは、grep\を受け取ったことがないことを示す、一致した文字を正確に出力します。


/bin/echoまたはenv echoを実行しない限り、シェルの組み込みechoが実行されます。したがって、ドキュメントを確認する場合は、help echoを実行するか、man bashを確認してください。 man echo/bin/echo用です:

$ echo --help
--help
$ env echo --help
Usage: echo [SHORT-OPTION]... [STRING]...
  or:  echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognised:

  \\      backslash
...

man bash、セクションShell BUITLIN COMMANDSを参照してください。

  echo interprets the following escape sequences:
  \a     alert (bell)
  \b     backspace
  \c     suppress further output
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is  the  octal  value
         nnn (zero to three octal digits)
  \xHH   the  eight-bit  character  whose value is the hexadecimal
         value HH (one or two hex digits)
2
muru