Siempre pensé que bash trata las barras invertidas de la misma manera cuando se usan sin o con comillas dobles, pero estaba equivocado:
[[email protected] ~]$ echo "foo \ "
foo \
[[email protected] ~]$ echo foo \ # Space after \
foo
Entonces pensé que las barras invertidas siempre se imprimen cuando se usan comillas dobles, pero:
[[email protected] ~]$ echo "foo \" "
foo "
[[email protected] ~]$ echo "foo \\ "
foo \
¿Por qué se muestra la barra invertida en la primera línea de código?
Respuesta aceptada:
La sección 3.1.2.3 Comillas dobles del manual GNU Bash dice:
La barra invertida conserva su significado especial solo cuando va seguida de uno de
los siguientes caracteres:‘$
', '`
’, ‘"
', '\
', o newline
. Dentro de las comillas dobles, se eliminan las barras invertidas seguidas de uno
de estos caracteres. Las barras invertidas que preceden a los caracteres
sin un significado especial no se modifican. Una comilla doble puede estar
entre comillas dobles precediéndola de una barra invertida. Si
está habilitado, la expansión del historial se realizará a menos que aparezca un '!
’ que aparece
entre comillas dobles se escapa usando una barra invertida. La barra invertida que precede
al '!
' no se elimina.
Así \
entre comillas dobles se trata de forma diferente a \
entre comillas simples y \
comillas exteriores. Se trata literalmente, excepto cuando está en condiciones de hacer que se trate literalmente un carácter que, de otro modo, podría tener un significado especial entre comillas dobles.
Tenga en cuenta que secuencias como \'
, \?
y \*
se tratan literalmente y la barra invertida no se elimina, porque '
, ?
y *
ya no tienen un significado especial cuando están entre comillas dobles.