Como você escapa do apóstrofo em uma cadeia de caracteres entre aspas simples no bash?


18

Eu não entendo como o bash avalia a fuga de caracteres de apóstrofo em seqüências de caracteres entre aspas simples.

Aqui está um exemplo:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Tentei procurar explicações para isso, mas não consegui nada. O que o bash está fazendo aqui?


echo \''Hello World'\'
math

Respostas:


19

Em aspas simples, não é possível escapar. Não há como incluir uma aspas simples em aspas simples. Veja Citando em man bash .


11
Você está certo. O truque está nessa linha 'Uma única citação pode não ocorrer entre aspas simples, mesmo quando precedida por uma barra invertida'. Portanto, provavelmente a divide em partes diferentes.
Kibet

@ Colin Assim que uma única citação estiver dentro de duas outras aspas simples (mas com barra invertida), a citação citada não será mais uma citação real. É apenas um caractere sem características especiais de emparelhamento.
Zero2cx 01/10/12

11
@ zero2cx: Não é verdade:echo '\''
choroba 31/03

@ zero2cx: eu diria "fora" em vez de "dentro".
#

3
@choroba não "totalmente" verdadeiro, em bash que você pode fazerecho $'\'hello world\''
bufh

9

Além das aspas simples e dupla suportadas pelo POSIX, bashfornece um tipo adicional de aspas para permitir uma pequena classe de caracteres de escape (incluindo uma aspas simples) em uma sequência de caracteres citada:

$ echo $'\'Hello World\''
'Hello World'

Veja a seção de CITAÇÕES na bashpágina de manual, perto do final da seção. (Procure por "ANSI C".)


3

Para explicar o que está acontecendo com seus apóstrofes escapados, examinaremos seu segundo exemplo (também veja aspas simples ou fortes ):

$ echo '\'Hello World\''
>     # expects you to continue input

Aqui, você deixou a cotação suspensa, como declarou. Agora apare o final e mude para:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

A sub-string "Hello World" não foi citada aqui, mas se comportou como se fosse forte. Usando seu exemplo novamente, apare o final de maneira diferente desta vez:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

A sub-string "Hello World" se comporta novamente como se fosse uma citação forte, com apenas o apóstrofo adicionado (escapou, portanto não é mais uma citação) no final.

Quando outra aspas simples é adicionada ao final (seu exemplo original), a sequência é deixada suspensa e aguardando uma cotação fechada.


3

Exemplo simples de escape de aspas no shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Isso é feito fechando um já aberto ( '), colocando um escapado ( \') para imprimir e abrindo outro ( ').

Alternativamente:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Isso é feito finalizando já aberto um ( '), colocando aspas em outro aspas ( "'") e abrindo outro ( ').

O que você fez ( '\'Hello World\'') é:

  1. Abriu 1 apóstrofo: '.
  2. Fechou logo depois \', assim que a corda torna-se: '\'.
  3. Hello World não é aspas.
  4. Apóstrofo independente colocado ( \') sem abri-lo.
  5. O último apóstrofo ( ') está abrindo a string, mas não há um fechamento esperado.

Portanto, o exemplo correto seria:

$ echo \'Hello World\'
'Hello World'

Relacionado: Como escapar de aspas simples em strings de aspas simples?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.