¿Cómo escapas del apóstrofe en una cadena entre comillas simples en bash?

18

No entiendo cómo bash evalúa el escape de caracteres de apóstrofe en cadenas entre comillas simples.

Aquí hay un ejemplo:

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

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

Intenté buscar explicaciones para esto, pero no pude obtener nada. ¿Qué está haciendo bash aquí?

Kibet
fuente
echo \''Hello World'\'
matemáticas

Respuestas:

19

Entre comillas simples, no es posible escapar. No hay forma de incluir una comilla simple en comillas simples. Ver cita en man bash .

choroba
fuente
1
Tienes razón. El truco está en esa línea: "Una comilla simple puede no ocurrir entre comillas simples, incluso cuando va precedida de una barra diagonal inversa", por lo que probablemente la divide en diferentes partes.
Kibet
@Colin Tan pronto como una cita simple esté dentro de otras dos citas simples (pero con una barra invertida), la cita citada ya no es una cita real. Es solo un char sin características especiales de emparejamiento.
zero2cx
1
@ zero2cx: No es cierto:echo '\''
choroba
@ zero2cx: diría "afuera" en lugar de "adentro".
choroba 01 de
3
@choroba no es "totalmente" cierto, en bash puedes hacerloecho $'\'hello world\''
bufh
9

Además de las comillas simples y dobles compatibles con POSIX, bashproporciona un tipo adicional de comillas para permitir una pequeña clase de caracteres escapados (incluida una comilla simple) en una cadena entre comillas:

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

Consulte la sección CITA en la bashpágina del manual, cerca del final de la sección. (Busque "ANSI C").

chepner
fuente
3

Para explicar lo que está sucediendo con sus apóstrofes escapados, examinaremos su segundo ejemplo (también ver comillas simples o comillas fuertes ):

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

Aquí, has dejado la cita pendiente, como has dicho. Ahora recorte el final y cámbielo a:

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

La subcadena "Hello World" no fue citada aquí, pero se comportó como si fuera una cita fuerte. Usando su ejemplo nuevamente, recorte el final de manera diferente esta vez:

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

La subcadena "Hello World" nuevamente se comporta como si fuera una cita fuerte, con solo el apóstrofe agregado (escapado, por lo que ya no hay una sola cita) al final.

Cuando se agrega otra comilla simple al final (su ejemplo original), la cadena se deja colgando y esperando una comilla cerrada.

zero2cx
fuente
3

Ejemplo simple de comillas de escape en shell:

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

Se realiza cerrando uno ya abierto (' ), colocando uno escapado ( \') para imprimir y luego abriendo otro ( ').

Alternativamente:

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

Se hace al terminar uno abierto ( '), colocando una cita en otra cita ("'" ), luego abriendo otra ( ').

Que hiciste ('\'Hello World\'' ), es:

  1. Abierto 1er apóstrofe:' .
  2. Cerrado justo después \', la cadena se convierte en:'\' .
  3. Hello World No son citas.
  4. Colocado apóstrofe independiente (\' ) sin abrirlo.
  5. El último apóstrofe ( ') está abriendo una cadena, pero no se espera cerrar ninguna.

Entonces el ejemplo correcto sería:

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

Relacionado: ¿Cómo escapar de comillas simples dentro de cadenas de comillas simples?

kenorb
fuente