Las barras invertidas son tratadas especialmente por echo -e
, pero primero a veces son tratadas especialmente por el shell (que en este caso es bash
), de acuerdo con las reglas de cotización del shell .
El argumento echo
realmente ve es Hello\\n
. Debido a que ha pasado -e
a echo
, trata especialmente los escapes de barra invertida y \\
se contrae en uno solo \
. La final n
no se escapa, por lo que aparece literalmente.
La razón de esto es que, antes y por separado de la operación de echo
sí mismo, el shell trata \
especialmente en algunos contextos pero no en otros. Los \
caracteres sin comillas siempre se tratan especialmente, las comillas simples \
nunca se tratan especialmente, pero el tratamiento de los \
caracteres con comillas dobles , como en el comando que ejecutó, es más sutil y complicado.
Cuando el shell encuentra texto entre comillas dobles en un comando, como con "Hello\\\n"
, trata \
como un carácter de escape cuando precede a un carácter que puede tener un significado especial dentro de comillas dobles y no de otra manera .
- Debido a que a
\
veces tiene un significado especial en el interior ""
, un \
que precede inmediatamente a otro \
tiene el efecto de citar ese segundo \
. Entonces, dentro de las comillas dobles, las primeras \\
se contraen \
.
- Después de esos dos primeros
\
caracteres, hay un tercer \
personaje que no se ve afectado por esos dos primeros y que precede a un n
. Pero n
no es un personaje que alguna vez se trata especialmente entre comillas dobles, por lo que \
antes no se trata especialmente en esta situación. Así se \n
queda \n
.
El efecto es que, entre comillas dobles, \\\n
se interpreta como \\n
.
Cuando echo -e
ve \\n
, el primero \
elimina el significado especial del segundo, por lo que echo
imprime \n
literalmente para ese texto.
Si su objetivo es imprimir Hello
con una nueva línea adicional pero sin barras invertidas (la pregunta era originalmente ambigua sobre esto, además creo que es un ejemplo útil), entonces una solución es eliminar a \
. Ejecución de echo -e "Hello\\n"
salidas Hello
con una nueva línea adicional al final.
Una mejor solución es usar comillas simples y escribir echo -e 'Hello\n'
. Las comillas simples son la forma más fuerte de citar. Por lo general, una solución aún mejor es usar en printf
lugar de echo
, lo que en este caso sería printf 'Hello\n\n'
.
Si su objetivo es imprimir, Hello\
incluida la barra diagonal inversa, seguida de una nueva línea adicional , entonces el enfoque con comillas dobles es posible pero engorroso. Para averiguarlo, al revés de trabajo: echo -e
convertidos \\
a \
y \n
a una nueva línea, y los convertidos de doble citando \\
a \
, para que pueda hacerlo con seis barras invertidas ( echo -e "Hello\\\\\\n"
), ya que \\n
se convierte en \n
debido a una barra invertida de escape otra. También puede hacerlo con cinco, porque las comillas dobles se conservan \n
cuando \
no se escapa.
Esto ilustra el beneficio de echo -e
las comillas simples: simplemente ponga lo que quiera ver dentro de las comillas simples ( echo -e 'Hello\\\n'
). printf
También es bueno aquí. Una opción es printf 'Hello\\\n\n'
. Pero lo que printf
realmente brilla es que puedes conectar argumentos adicionales. Puede usar printf '%s\n\n' 'Hello\'
, que inserta el segundo argumento (literalmente Hello\
porque las comillas simples no cambian nada) en lugar de %s
.