Como você evita apóstrofos em uma única string entre aspas no bash?

16

Eu não entendo como o bash avalia o escape de caracteres de apóstrofe em strings entre aspas simples.

Aqui está um exemplo:

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

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

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

    
por Kibet 01.10.2012 / 12:04

4 respostas

16

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

    
por 01.10.2012 / 12:11
5

Além das cotações simples e duplas suportadas por POSIX, bash fornece um tipo adicional de cotação para permitir uma pequena classe de caracteres com escape (incluindo uma aspa simples) em uma string entre aspas:

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

Consulte a seção QUOTING na página bash man, perto do final da seção. (Procurar por "ANSI C".)

    
por 01.10.2012 / 16:50
3

Para explicar o que está acontecendo com seus apóstrofos de escape, examinaremos seu segundo exemplo (veja também aspas simples ou citações strongs ):

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

Aqui, você deixou a citação suspensa, como você afirmou. 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 citada com força. 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" novamente se comporta como se fosse uma strong citação, com apenas o apóstrofo adicionado (com escape, não mais uma citação) no final.

Quando outra aspa simples é adicionada ao final (seu exemplo original), a sequência é deixada pendente e aguardando uma cotação de fechamento.

    
por 01.10.2012 / 12:35
2

Exemplo simples de escape de citações no shell:

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

É feito terminando um já aberto ( ' ), colocando um com escape ( \' ), depois abrindo outro ( ' ).

Alternativamente:

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

É feito ao terminar de abrir um ( ' ), colocando a cotação em outra cotação ( "'" ), depois abrindo outro ( ' ).

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

  1. 1o apóstrofo aberto: ' .
  2. Fechado logo depois de \' , então a string se torna: '\' .
  3. Hello World não é aspas.
  4. Apóstrofe autônomo colocado ( \' ) sem abri-lo.
  5. O último apóstrofo ( ' ) está abrindo uma string, mas não há nenhuma que seja esperada.

Então, o exemplo correto seria:

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

Relacionados: Como escapar de aspas simples dentro de strings entre aspas simples?

    
por 28.02.2015 / 22:12