RESPUESTA CORTA
Como otros han dicho - siempre hay que citar las variables para evitar un comportamiento extraño. Así que utilice echo "$ foo" en lugar de sólo echo $ foo.
respuesta larga
yo creo este ejemplo merece mayor explicación porque hay más en juego de lo que parece en la cara de ella.
puedo ver dónde está su confusión viene adentro porque después de ejecutar el primer ejemplo que probablemente pensó a sí mismo que la cáscara está haciendo obvio:
- expansión de parámetros
- expansión Nombre
por lo que desde su primer ejemplo:
me$ FOO="BAR * BAR"
me$ echo $FOO
Un espués de la expansión de parámetro es equivalente a:
me$ echo BAR * BAR
Y después de la expansión de nombre de archivo es equivalente a:
me$ echo BAR file1 file2 file3 file4 BAR
Y si sólo tiene que teclear echo BAR * BAR
en la línea de comando que va a ver que son equivalentes.
Así que probablemente pensado a sí mismo "si me escape el *, puedo evitar que la expansión de nombre de archivo"
Así que a partir de su segundo ejemplo:
me$ FOO="BAR \* BAR"
me$ echo $FOO
Después de la expansión de parámetro debe ser equivalente a:
me$ echo BAR \* BAR
Y después de la expansión de nombre de archivo debe ser equivalente a:
me$ echo BAR \* BAR
Y si intenta escribir "echo BAR \ * BAR" directamente en la línea de comandos, imprimirá "BAR * BAR" porque la expansión del nombre de archivo se previene con el escape.
Entonces, ¿por qué usar $ foo no funciona?
Es porque hay una tercera expansión que tiene lugar - Quitar la eliminación. A partir de la extracción manual cotización Bash es:
Después de las expansiones anteriores, todos los ocurrencias no cotizados de los personajes '\', ''', y '"' que no resultaron de una de las expansiones anteriores son eliminado.
así que lo que sucede es cuando se escribe el comando directamente en la línea de comandos, el carácter de escape no es el resultado de una expansión previa de modo BASH lo elimina antes de enviarlo al comando de eco, pero en el segundo ejemplo, el "\ *" fue el resultado de una expansión de parámetro anterior, por lo que NO se elimina Como resultado, el eco recibe "\ *" y eso es lo que imprime.
Tenga en cuenta que la diferencia entre el primer ejemplo - "*" no está incluida en los caracteres que se eliminarán mediante Quote Removal.
Espero que esto tenga sentido. Al final la conclusión es la misma: solo use comillas. Solo pensé en explicar por qué el escape, que lógicamente debería funcionar si solo están en juego la expansión de parámetros y nombres de archivo, no funcionó.
Para una explicación completa de las expansiones Bash, se refieren a:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
esto es misterioso, ¿por qué es esto? ¿Que esta pasando? – tofutim