Dem repo
Befehl ist es egal, welche Art von Anführungszeichen er erhält. Wenn Sie eine Parametererweiterung benötigen, verwenden Sie doppelte Anführungszeichen. Wenn dies bedeutet, dass Sie eine Menge Dinge rückgängig machen müssen, verwenden Sie für das meiste einfache Anführungszeichen und brechen Sie dann aus diesen heraus und gehen Sie für den Teil, in dem die Erweiterung stattfinden soll, in Doppel.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
Erklärung folgt, wenn Sie interessiert sind.
Wenn Sie einen Befehl über die Shell ausführen, empfängt dieser Befehl als Argumente ein Array von nullterminierten Zeichenfolgen. Diese Zeichenfolgen können absolut jedes Nicht-Null-Zeichen enthalten.
Wenn die Shell dieses Array von Zeichenfolgen über eine Befehlszeile erstellt, werden einige Zeichen speziell interpretiert. Dies soll die Eingabe von Befehlen erleichtern (tatsächlich möglich machen). Beispielsweise geben Leerzeichen normalerweise die Grenze zwischen Zeichenfolgen im Array an. Aus diesem Grund werden die einzelnen Argumente manchmal als "Wörter" bezeichnet. Ein Argument kann jedoch Leerzeichen enthalten. Sie brauchen nur eine Möglichkeit, der Shell zu sagen, dass Sie das wollen.
Sie können einen Backslash vor einem beliebigen Zeichen (einschließlich Leerzeichen oder einem anderen Backslash) verwenden, um die Shell anzuweisen, dieses Zeichen wörtlich zu behandeln. Aber während Sie so etwas tun können:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... es kann lästig werden. Die Shell bietet also eine Alternative: Anführungszeichen. Diese kommen in zwei Hauptsorten.
Doppelte Anführungszeichen werden als "Gruppieren von Anführungszeichen" bezeichnet. Sie verhindern, dass Platzhalter und Aliase erweitert werden, aber meistens dienen sie dazu, Leerzeichen in ein Wort aufzunehmen. Andere Dinge wie die Parameter- und Befehlserweiterung (die Art von Dingen, die durch a signalisiert werden $
) passieren immer noch. Und wenn Sie ein wörtliches doppeltes Anführungszeichen in doppelten Anführungszeichen haben möchten, müssen Sie es natürlich umkehren:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Einfache Anführungszeichen sind drakonischer. Alles zwischen ihnen wird buchstäblich genommen, einschließlich Backslashes. Es gibt absolut keine Möglichkeit, ein wörtliches einfaches Anführungszeichen in einfache Anführungszeichen zu setzen.
Glücklicherweise sind Anführungszeichen in der Shell keine Worttrennzeichen . an sich beenden sie kein Wort. Sie können innerhalb desselben Wortes in Anführungszeichen ein- und ausgehen, auch zwischen verschiedenen Arten von Anführungszeichen, um das gewünschte Ergebnis zu erzielen:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Das ist also einfacher - viel weniger Backslashes, obwohl die Sequenz "Close-Single-Quote", "Backslashed-Literal-Single-Quote", "Open-Single-Quote" gewöhnungsbedürftig ist.
Moderne Shells haben einen weiteren Anführungszeichenstil hinzugefügt, der nicht im POSIX-Standard festgelegt ist. Dem führenden einfachen Anführungszeichen wird ein Dollarzeichen vorangestellt. So zitierte Zeichenfolgen folgen ähnlichen Konventionen wie Zeichenfolgenliterale in der Programmiersprache ANSI C und werden daher manchmal als "ANSI-Zeichenfolgen" und das $'
... '
Paar "ANSI-Anführungszeichen" bezeichnet. Innerhalb solcher Zeichenfolgen gilt der obige Hinweis, dass Backslashes buchstäblich verwendet werden, nicht mehr. Stattdessen werden sie wieder zu etwas Besonderem. Sie können nicht nur ein wörtliches einfaches Anführungszeichen oder einen umgekehrten Schrägstrich einfügen, indem Sie ihm einen umgekehrten Schrägstrich voranstellen, sondern die Shell erweitert auch die \n
Escapezeichen \t
für ANSI C-Zeichen (z. B. für eine neue Zeile, für Tabulatoren und \xHH
für das Zeichen mit HexadezimalcodeHH
). Andernfalls verhalten sie sich jedoch wie Zeichenfolgen in einfachen Anführungszeichen: Es findet keine Parameter- oder Befehlsersetzung statt:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
Es ist wichtig zu beachten, dass die einzelne Zeichenfolge, die als Argument für den echo
Befehl empfangen wird , in all diesen Beispielen genau dieselbe ist . Nachdem die Shell eine Befehlszeile analysiert hat, kann der ausgeführte Befehl nicht mehr angeben, was wie angegeben wurde. Auch wenn es wollte.
repo forall -c ' ...before... '"$variable"' ...after...'