Nas aspas simples, não é possível escapar. Não há como incluir uma aspa simples em aspas simples. Veja Quoting em man bash .
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?
Nas aspas simples, não é possível escapar. Não há como incluir uma aspa simples em aspas simples. Veja Quoting em man bash .
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".)
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.
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\''
) é:
'
. \'
, então a string se torna: '\'
. Hello World
não é aspas. \'
) sem abri-lo. '
) 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?