La différence essentielle entre ces deux séquences de commande est que la seconde contient echo $b
qui exécute Shell division des mots . Pour que la deuxième séquence de commande s'exécute de la même manière que la première, remplacez :
echo $b | grep "*)>nS4XkrlH @XUL"
avec :
echo "$b" | grep "*)>nS4XkrlH @XUL"
Séparation des mots
Observez comment les espaces sont traités dans ces deux echo
déclarations :
$ b="a b c"
$ echo "$b"
a b c
$ echo $b
a b c
Sans les doubles guillemets, le Shell effectue un découpage des mots sur les arguments à echo
. Cela signifie que tous les espaces blancs consécutifs sont condensés en un seul espace. Avec les guillemets doubles, le fractionnement des mots est supprimé et les espaces blancs sont préservés.
Le fractionnement des mots et un grep
Motif avec espaces multiples
Votre grep
contient deux espaces consécutifs. À moins que l'argument de echo
est entre guillemets, la sortie de echo
ne comportera pas ces deux espaces et aucune correspondance ne sera trouvée. Observez :
$ b="*)>nS4XkrlH @XUL"
$ echo $b | grep "*)>nS4XkrlH @XUL"
$ echo "$b" | grep "*)>nS4XkrlH @XUL"
*)>nS4XkrlH @XUL
Le premier grep
ne correspond à rien, mais le second oui. La différence est le fractionnement des mots du Shell.