Der Schlüsselschlüsselunterschied zwischen diesen beiden Befehlssequenzen besteht darin, dass die zweite enthält, echo $bdie die Aufteilung von Shell- Wörtern durchführt . Ersetzen Sie Folgendes, damit die zweite Befehlssequenz mit der ersten übereinstimmt:
echo $b | grep "*)>nS4XkrlH @XUL"
mit:
echo "$b" | grep "*)>nS4XkrlH @XUL"
Wortteilung
Beobachten Sie, wie Leerzeichen in diesen beiden echoAnweisungen behandelt werden:
$ b="a b c"
$ echo "$b"
a b c
$ echo $b
a b c
Ohne die doppelten Anführungszeichen führt die Shell eine Wortteilung für die Argumente zu durch echo. Dies bedeutet, dass alle aufeinander folgenden Leerzeichen auf ein einzelnes Leerzeichen komprimiert werden. Bei doppelten Anführungszeichen wird die Wortteilung unterdrückt und das Leerzeichen beibehalten.
Wortteilung und ein grepMuster mit mehreren Leerzeichen
Ihr grepMuster enthält zwei aufeinanderfolgende Leerzeichen. Wenn das Argument to nicht echoin doppelten Anführungszeichen steht, enthält die Ausgabe von echodiese beiden Leerzeichen nicht und es wird keine Übereinstimmung gefunden. Beobachten:
$ b="*)>nS4XkrlH @XUL"
$ echo $b | grep "*)>nS4XkrlH @XUL"
$ echo "$b" | grep "*)>nS4XkrlH @XUL"
*)>nS4XkrlH @XUL
Das erste grepstimmt mit nichts überein, das zweite mit nichts. Der Unterschied ist die Wortspaltung der Muschel.