Beim Versuch, nach einem einfachen Muster "Hallo" in einer Datei zu suchen, funktionieren alle folgenden Formen von grep:
- grep hallo file1
- grep 'Hallo' file1
- grep "hallo" file1
Gibt es einen bestimmten Fall, in dem eine der oben genannten Formen funktioniert, andere jedoch nicht. Macht es einen Unterschied, ob ich eines anstelle eines anderen verwende?
$
steht in einem regulären Ausdruck am Ende der Zeile und$VAR1
sollte daher niemals mit etwas übereinstimmen. Es funktioniert zwar mit GNU grep, aber ich würde trotzdem nicht mit diesem Verhalten rechnen. Sie müssen\$VAR1
die Literalzeichenfolge sicher zuordnen. (Und Sie würden zusätzliche Backslashes benötigen, wenn das in doppelten Anführungszeichen steht.)James ist richtig, aber um einige weitere Daten hinzuzufügen, denke ich, dass die beste Möglichkeit ist, sie als Argumente für den Befehl zu betrachten: Beabsichtigen Sie, dass "Hallo" und "Welt" zwei Argumente sind, oder dass "Hallo Welt" eines ist? Streit.
Doppelte Anführungszeichen ermöglichen auch die Interpretation von mehr als nur Variablen. Genau das, was von Ihrer Shell abhängt, aber prüfen Sie die Verlaufserweiterung, Klammererweiterung und Dateinamenerweiterung.
Es ist auch wichtig zu beachten, dass es einige Fälle gibt, in denen Sie beide Arten von Anführungszeichen in einem einzigen Argument verwenden müssen. Denken Sie daran, dass (standardmäßig) Argumente durch Leerzeichen begrenzt sind. Wenn Sie also kein Leerzeichen lassen, geben Sie immer noch dasselbe Argument an.
Der Singlequote-Mechanismus der meisten Shells lässt keine Sonderzeichen zu, was bedeutet, dass jede Instanz eines anderen Singlequote, auch wenn es als maskiert erscheint, das Anführungszeichen beendet. Es ist daher nicht möglich, eine Zeichenfolge mit einem einfachen Anführungszeichen in einer Zeichenfolge mit einem einfachen Anführungszeichen zu übergeben, und Sie müssen doppelte Anführungszeichen verwenden. Dies kann schwierig sein, wenn Sie ein Argument übergeben möchten, das einfache Anführungszeichen und etwas enthält, das interpretiert werden würde, das Sie aber nicht wollen. Wenn Sie beispielsweise die Literalzeichenfolge "$ VAR ist eine Variable" übergeben möchten, müssen Sie dies folgendermaßen tun:
Das ist eigentlich eine Verkettung von drei mit Anführungszeichen versehenen Zeichenfolgen:
oder mit entfernten Anführungszeichen:
Eigentlich könnte man es mit den meisten Shells auch so machen:
Dabei
\
weist der Backslash (" ") die Shell an, das folgende Zeichen wörtlich zu akzeptieren und es nicht zu erweitern.Aber es gibt einige Fälle, in denen Sie es auf die Weise der Multi-String-Verkettung machen müssen, nicht dass ich mir gerade ein Beispiel einfallen lassen kann.
quelle