comilla simple dentro de comillas dobles y el manual de referencia Bash

18

En la sección 3.1.2.3 titulada Double Quotes, el manual de Bash dice:

Encerrar caracteres entre comillas dobles ( '"') preserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de '$', ''', '\', y, cuando la expansión de historia está activado, '!'.

Por el momento estoy preocupado con la comilla simple ( ').

Su significado especial, descrito en la sección anterior, sección 3.1.2.2 es:

El encerrar caracteres entre comillas simples ( ') conserva el valor literal de cada carácter dentro de las comillas. Una comilla simple no puede aparecer entre comillas simples, incluso cuando está precedida por una barra invertida.

Combinando las dos exposiciones,

 echo "'$a'"

donde la variable ano está definida (por lo tanto $a= cadena nula), debe imprimirse $aen la pantalla, ya que '', teniendo su significado especial en el interior, protegería $de la interpretación especial. En cambio, se imprime ''. ¿Porque?

Lavya
fuente

Respuestas:

21

El 'carácter de comillas simples en su echoejemplo obtiene un valor literal (y pierde su significado) al encerrarse entre comillas dobles ( "). Los caracteres delimitadores son comillas dobles.

Lo que puede hacer es imprimir las comillas simples por separado:

echo "'"'$a'"'"

o escapar de $:

echo "'\$a'"
Anthon
fuente
¡Oh, tienes toda la razón! El resultado es consistente con su respuesta, pero mi duda fue con la línea "El encerrar caracteres entre comillas dobles ('"') conserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de '$', ' ’, ‘\’, and, when history expansion is enabled, ‘!’." in the manual. But now reading it again I realized the second character is not single quote, ("'") but tilde (""). I'
Estoy
2
El segundo carácter mencionado en el manual es el backtick, no la tilde.
Kenny Evitt el
6

Usted malinterpreta la documentación:

teniendo su significado especial en el interior, protegería $ de la interpretación especial

"Tener su significado especial" significa que se interpreta especialmente no literalmente. Las comillas simples previenen $de ser ampliado. Pero las comillas simples dentro de las comillas dobles son caracteres literales, es decir, no afectan nada. Si desea que la salida $aentonces necesita echo '$a'.

Hauke ​​Laging
fuente
tienes razón. No solo entendí mal el documento, sino que lo leí mal (¡marcando "` "para" '"!). tienes razón sobre "las comillas simples entre comillas dobles son caracteres literales". ¡Gracias!
Lavya