RÉPONSE À COURT
Comme d'autres l'ont dit - vous devez toujours citer les variables pour éviter des comportements étranges. Donc, utilisez echo "$ foo" au lieu de simplement echo $ foo.
RÉPONSE À LONG
je pense cet exemple mérite plus d'explications parce qu'il ya plus de choses que cela puisse paraître sur le visage de celui-ci.
je peux voir où votre confusion vient parce que, après que vous avez exécuté votre premier exemple vous avez probablement pensé à vous-même que la coquille est évidemment fait:
- extension des paramètres
- extension Nom du fichier
Donc, à partir de votre premier exemple:
me$ FOO="BAR * BAR"
me$ echo $FOO
A l'expansion des paramètres près avoir est équivalent à:
me$ echo BAR * BAR
Et après extension de nom de fichier 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.
Alors vous avez probablement pensé à vous-même « si j'échapper au *, je peux empêcher l'extension de nom de fichier »
donc de votre deuxième exemple:
me$ FOO="BAR \* BAR"
me$ echo $FOO
Après l'expansion des paramètres devrait être équivalent à:
me$ echo BAR \* BAR
après l'expansion du nom de fichier doit être équivalent à:
me$ echo BAR \* BAR
Et si vous essayez de taper "echo BAR \ * BAR" directement dans la ligne de commande, il affichera en effet "BAR * BAR" car l'extension du nom de fichier est empêchée par l'échappement. Alors pourquoi utiliser $ foo ne fonctionne-t-il pas?
C'est parce qu'il y a une troisième expansion qui a lieu - Suppression de citation. De la suppression de devis manuel bash est:
Après les extensions précédentes, tous les non cotées occurrences des caractères « \ », « » », et « " » qui ne résultent d'une des extensions ci-dessus sont enlevés.
alors qu'est-ce qui se passe est lorsque vous tapez la commande directement dans la ligne de commande, le caractère d'échappement n'est pas le résultat d'une expansion précédente de sorte BASH il supprime avant de l'envoyer à la commande echo, mais le deuxième exemple, le "\ *" était le résultat d'une extension de paramètre précédente, donc il n'est pas supprimé En conséquence, 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 suppression de devis.
J'espère que cela a du sens. À la fin, la conclusion dans le même - juste utiliser des citations. Je pensais juste que j'expliquerais pourquoi l'échappement, qui devrait logiquement fonctionner si seulement l'extension Parameter et Filename est en jeu, n'a pas fonctionné.
Pour une explication complète des extensions BASH, reportez-vous à:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
c'est mystérieux, pourquoi est-ce? que se passe-t-il? – tofutim