Diferença entre echo -e “string” e echo $ “string”

14

Qual é a diferença entre usar

echo -e "Hello\nWorld" 

e

echo $"Hello\nWorld" 

não os dois saem:

Hello
World
    
por Mark 16.10.2014 / 23:42

1 resposta

26

echo -e e echo $'...' são semelhantes, pois suportam as seguintes sequências de escape:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \     backslash
  
  \c     suppress further output
  
$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop
nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
nnn 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) \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Eles têm diferenças. Além do acima, echo -e suporta:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Por contraste, $'....' suporta:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Observe que, entre os dois, as extensões \c são incompatíveis:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \     backslash
  
  \c     suppress further output
  
$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop
nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
nnn 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) \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Para echo -e acima, \c suprime mais saída, ignorando, assim, o Istop . Por contraste, para $'...' , o \cI é interpretado como uma guia.

A forma visualmente semelhante: $"..."

Por contraste com $'...' , a função de $"..." é bem diferente. Isso fará com que a string contida seja traduzida de acordo com a localidade atual.

A controvérsia echo -e

echo -e não é universalmente suportado pelos shells e muitos consideram a opção -e como um erro de design. Observe:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Como você pode ver, se o que você está imprimindo com echo começa com um traço, os resultados podem ser inesperados. A menos que você tenha certeza de que a primeira string que será impressa com echo não comece com um traço, provavelmente será melhor usar printf .

Por esses motivos, o padrão POSIX é concluído :

New applications are encouraged to use printf instead of echo.

Chet Ramey, que manteve bash nos últimos 22 anos, concorda :

[N]ew code should use printf.

    
por John1024 16.10.2014 / 23:59