RÉPONSE COURTE
Comme d'autres l'ont dit -, vous devez toujours citer les variables afin de prévenir des comportements étranges. Donc, utilisez echo "$foo" , au lieu de simplement echo $foo.
RÉPONSE LONGUE
Je pense que cet exemple mérite une explication, car il ya plus de choses qu'il ne paraît sur le visage de celui-ci.
Je peux voir où votre confusion vient de parce que, après vous avez effectué votre premier exemple, vous avez probablement pensé à vous-même que la coquille est de toute évidence en train de faire:
- Paramètre d'extension
- Nom du fichier d'extension
Donc, à partir de votre premier exemple:
me$ FOO="BAR * BAR"
me$ echo $FOO
Après le paramètre d'expansion est équivalent à:
me$ echo BAR * BAR
Et après le nom de fichier d'extension est équivalent à:
me$ echo BAR file1 file2 file3 file4 BAR
Et si vous tapez juste *echo * BAR* BAR dans la ligne de commande, vous verrez qu'ils sont équivalents.
Donc, vous avez probablement pensé à vous-même "si je échapper à l' *, je ne peux empêcher le nom du fichier d'extension"
Donc, à partir de votre deuxième exemple:
me$ FOO="BAR \* BAR"
me$ echo $FOO
Paramètre après l'expansion devrait être équivalente à:
me$ echo BAR \* BAR
Et après le nom de fichier d'extension doit être équivalente à:
me$ echo BAR \* BAR
Et si vous essayez de taper "echo BAR \* BAR" directement dans la ligne de commande, il sera en effet l'impression de "BAR * BAR" parce que le nom de fichier d'extension est empêché par la fuite.
Alors, pourquoi à l'aide de $foo pas de travail?
C'est parce qu'il y a une troisième extension qui prend la place de Devis Déménagement. À partir du bash manuel de devis déménagement est:
Après les précédentes extensions, toutes les
non cotées occurrences des caractères
‘ \ ', ‘ 'et ‘"' qui n'ont pas abouti
à partir de l'une de ces extensions sont à l'
supprimé.
Donc ce qui se passe lorsque vous tapez la commande directement dans la ligne de commande, le caractère d'échappement n'est pas le résultat d'une précédente expansion de BASH le supprime avant de l'envoyer à la commande echo, mais dans le 2ème exemple, le "\*" est le résultat d'un Paramètre précédent expansion, de sorte qu'il n'est PAS supprimé. En conséquence, l'echo reçoit "\*" et c'est ce qu'il imprime.
Notez la différence entre le premier exemple - "*" n'est pas inclus dans les caractères qui seront supprimés par Devis de Déménagement.
J'espère que cela a du sens. À la fin de la conclusion, dans le même - il suffit d'utiliser les guillemets. J'ai juste pensé que je voudrais vous expliquer pourquoi s'en échappe, ce qui logiquement devrait fonctionner si seul Paramètre et le nom de fichier d'extension sont en jeu, n'a pas fonctionné.
Pour une explication complète de BASH expansions, reportez-vous à:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions