Por que uma única barra invertida é exibida ao usar aspas

5

Eu sempre achei que o bash trata as barras invertidas da mesma forma quando uso sem ou com aspas duplas, mas eu estava errado:

[user@linux ~]$ echo "foo \ "
foo \
[user@linux ~]$ echo foo \ # Space after \
foo

Então, pensei que as barras invertidas são sempre impressas quando se usam aspas duplas, mas:

[user@linux ~]$ echo "foo \" "
foo "
[user@linux ~]$ echo "foo \ "
foo \

Por que a barra invertida na primeira linha de código é mostrada?

    
por Motte001 17.10.2017 / 16:32

2 respostas

8

Seção 3.1.2.3 Frases duplas do GNU Bash manual diz:

The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘'’, ‘"’, ‘\’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed.

Assim, \ entre aspas duplas é tratado de maneira diferente de \ em aspas simples e \ de aspas externas. Ele é tratado literalmente, exceto quando está em posição de fazer com que um caractere seja tratado literalmente, o que poderia ter um significado especial entre aspas duplas.

Observe que seqüências como \' , \? e \* são tratadas literalmente e a contrabarra não é removida, porque ' , ? e * já não têm significado especial quando colocadas em dobro citações.

    
por 17.10.2017 / 16:41
5

A barra invertida é interpretada de forma diferente de acordo com o contexto:

  • Entre aspas duplas (seu primeiro exemplo):

    The backslash  retains its special meaning  only when followed
    by one of the following characters: $, ', ", \, or <newline>.
    
  • Sem aspas (seu segundo exemplo):

    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).
    
  • Usando a construção $'....' , onde você pode usar dentro da citação o caractere de retrocesso padrão, quase como em C. \n , \t , etc.

  • Usando backquotes:

    When  the old-style  backquote form  of substitution  is used,
    backslash retains its literal  meaning except when followed by
    $, ', or \.
    

Fonte de citações: manual do bash

    
por 17.10.2017 / 16:41