it-swarm.com.de

Wie verwende ich ein Sonderzeichen als normales?

Viele Fragen wie 'Wie schreibe ich das Zeichen in doppelten Anführungszeichen (")?' werden gefragt, und wir möchten unsere Community nicht mit der gleichen Antwort überladen (Geben Sie sie als \" ein, wenn sie nicht in ' s eingeschlossen ist, ", wenn sie eingeschlossen ist in ' s.) Die Frage ist also hier.

Sie können keine Sonderzeichen wie normale in ein Terminal eingeben, z. Dieser Befehl schlägt fehl:

echo Updates (11)

Wie kann man diese Zeichen im Terminal eingeben, als wären sie normale Zeichen?

!#$^&*?[](){}<>~;'"\|<space><tab><newline>
13
EKons

Das hängt sehr stark von der Shell ab. Weitere Informationen finden Sie in Ihrem Shell-Handbuch.

Beachten Sie auch, dass einige Zeichen nur in bestimmten Kontexten speziell sind. Beispielsweise sind in den meisten Shells * und ? nur in Listenkontexten speziell, in POSIX- oder csh-ähnlichen Shells ist ~ nur am Anfang eines Wortes oder nach einigen Zeichen wie : speziell. Gleiches gilt für = in zsh. In einigen Shells ist [ nur dann etwas Besonderes, wenn (mit einigen Einschränkungen) ein ] übereinstimmt.

In einigen Shells wie bash oder yash variieren Sonderzeichen wie leere Token-Trennzeichen auch mit dem Gebietsschema.

Die Anführungszeichen (um die spezielle Bedeutung dieser Zeichen zu entfernen) variieren ebenfalls stark zwischen den Shells.

Bourne-ähnliche Muscheln

Eine Zusammenfassung für Bourne-ähnliche Muscheln (das sind die Muscheln, von denen bekannt ist, dass sie seit den 80er Jahren auf dem einen oder anderen System sh heißen):

Bourne Shell

Spezielle Charaktere:

  • "\'&|;()^`<>$, Leerzeichen, Zeilenumbruch und Tabulator sind in einfachen Befehlszeilen besonders, wenn sie nicht in Anführungszeichen gesetzt werden.
  • # (außer in der frühen Version) ist etwas Besonderes am Zeilenanfang oder nach einem nicht zitierten Leerzeichen, Tabulator oder &|()^<>;`.
  • { und } sind nur insofern besonders, als sie Shell-Schlüsselwörter sind (also nur Wörter an der Befehlsposition).
  • *?[ sind als Globbing-Operatoren speziell, also nur in Listenkontexten. Im Fall von [ ist [...] der Globbing-Operator. Entweder [ oder ] müssen nur in Anführungszeichen gesetzt werden, um die spezielle Bedeutung zu entfernen.
  • = ist etwas Besonderes, wenn es in Kontexten als Zuweisungsoperator behandelt wird. Das heißt, in einem einfachen Befehl für alle Wörter, die keinem Argument folgen (außer nach set -k).

Operatoren zitieren

  • \ zitiert alle Sonderzeichen außer newline (\<newline> ist eine Möglichkeit, eine lange logische Zeile in die nächste physische Zeile fortzusetzen, sodass diese Sequenz entfernt wird). Beachten Sie, dass Backticks zusätzliche Komplexität hinzufügen, da \ zuerst verwendet wird, um dem schließenden Backtick zu entkommen und dem Parser zu helfen. In doppelten Anführungszeichen darf \ nur verwendet werden, um sich selbst zu entkommen, ", $ und ` (\<newline> ist immer noch eine Zeilenfortsetzung). Innerhalb eines Here-Dokuments, mit Ausnahme von ". \ ist die einzige Möglichkeit, Zeichen in diesen Dokumenten zu umgehen.
  • "..." doppelte Anführungszeichen entziehen sich allen Zeichen außer sich selbst, \, $ und `.
  • '...' einfache Anführungszeichen entziehen sich allen Zeichen außer sich selbst.

POSIX-Shells

POSIX-Shells verhalten sich hauptsächlich wie die Bourne-Shell, außer dass:

  • ^ ist kein Sonderzeichen mehr
  • ~ ist in einigen Kontexten speziell
  • { darf etwas Besonderes sein und sollte daher in Anführungszeichen gesetzt werden.

ksh

wie POSIX, außer dass:

  • {string} ist etwas Besonderes, wenn die Zeichenfolge einen nicht zitierten , enthält (oder in einigen Fällen und in einigen Versionen ..).
  • ksh93 hat einen zusätzlichen speziellen Anführungszeichen-Operator: $'...' mit komplexen Regeln. Dieser Operator ist auch (mit einigen Variationen) in bash, zsh, mksh und FreeBSD und Busybox sh zu finden.
  • ksh93 hat auch einen $"..." Anführungszeichen-Operator, der wie "..." funktioniert, außer dass die Zeichenfolge lokalisiert werden muss (könnte so konfiguriert werden, dass sie in die Sprache des Benutzers übersetzt wird). mksh ignoriert den $ in $"...".

bash

wie ksh93 aber:

  • in Einzelbyte-Zeichen-Gebietsschemas werden alle leer (je nach Gebietsschema) Zeichen als Trennzeichen (wie Leerzeichen oder Tabulatoren) betrachtet. In der Tat bedeutet dies, dass Sie alle Bytes mit dem gesetzten 8. Bit in Anführungszeichen setzen sollten, falls sie in einem Gebietsschema ein Leerzeichen sein könnten.
  • Wenn die Erweiterung des csh-Verlaufs wie in interaktiven Instanzen aktiviert ist, ist ! in einigen Kontexten etwas Besonderes, und doppelte Anführungszeichen entgehen nicht immer. Und ^ ist etwas Besonderes am Anfang eines Befehls.

zsh

wie ksh93 aber:

  • dieselbe Anmerkung wie für bash für die Erweiterung des csh-Verlaufs
  • = ist als erstes Zeichen eines Wortes etwas Besonderes (=ls wird zu /bin/ls erweitert).
  • { und } können auch Befehlsgruppen öffnen und schließen, wenn sie nicht begrenzt sind (wie in {echo text} funktioniert wie Bournes { echo text;}).
  • mit Ausnahme von [ allein muss [ auch dann in Anführungszeichen gesetzt werden, wenn es nicht mit einem ] geschlossen wird.
  • Wenn die Option extendedglob aktiviert ist, sind #, ^ und ~ Globbing-Operatoren.
  • Mit der Option braceccl ist {non-empty-string} etwas Besonderes.
  • $"..." wird nicht unterstützt.
  • als besondere Eigenart ist ? nichts Besonderes, wenn Sie einem % (auch in Anführungszeichen oder erweitert) am Anfang eines Wortes folgen (um die Jobspezifikation %?name zuzulassen).
  • mit der Option rcquotes (standardmäßig nicht aktiviert) können einfache Anführungszeichen als '' in einfache Anführungszeichen à la rc eingegeben werden (siehe unten).

yash

wie POSIX außer dem.

  • alle Leerzeichen gelten als Trennzeichen.
  • Implementiert mit der Option brace-expand die Erweiterung der Klammer im zsh-Stil.

Für alle Shells gibt es einige spezielle Kontexte, in denen das Zitieren anders funktioniert. Wir haben hier bereits Dokumente und Backticks erwähnt, aber es gibt auch [[...]] in ksh und ein paar anderen Shells, POSIX $((...)), case Konstrukte ...

Beachten Sie auch, dass das Zitieren andere Nebenwirkungen haben kann, wenn es um Erweiterungen (mit doppelten Anführungszeichen) geht oder wenn es auf hier Dokumentbegrenzer angewendet wird. Es deaktiviert auch reservierte Wörter und wirkt sich auf die Alias-Erweiterung aus.

Zusammenfassung

In Bourne-ähnlichen Shells sind !#$^&*?[(){}<>~;'"`\|=, SPC, TAB, NEWLINE und einige Bytes mit dem gesetzten 8. Bit etwas Besonderes oder können es sein (zumindest in einigen Kontexten).

Um die spezielle Bedeutung zu entfernen, damit sie wörtlich behandelt wird, verwenden Sie Anführungszeichen.

Verwenden:

  • '...', um die besondere Bedeutung jedes Zeichens zu entfernen:

    printf '%s\n' '\/\/ Those $quoted$ strings are passed literally as
    single arguments (without the enclosing quotes) to `printf`'
    
  • \, um die spezielle Bedeutung nur eines Zeichens zu entfernen:

    printf '<%s>\n' foo bar\ baz #comment
    

    Oben wird nur das Leerzeichen, dem ein \ vorangestellt ist, buchstäblich an printf übergeben. Die anderen werden von der Shell als Token-Begrenzer behandelt.

  • verwenden Sie "...", um Zeichen in Anführungszeichen zu setzen, während Sie weiterhin die Parametererweiterung ($var, $#, ${foo#bar}...), die arithmetische Erweiterung ($((1+1)), auch $[1+1] in einigen Shells) und Befehlsersetzung ( $(...) oder die alte Form `...`. Eigentlich tun Sie meistens möchten diese Erweiterungen in jedem Fall in doppelte Anführungszeichen setzen . Sie können \ in "..." verwenden, um das Special zu entfernen Bedeutung der Zeichen, die noch etwas Besonderes sind (aber nur sie).
  • wenn die Zeichenfolge das Zeichen ' enthält, können Sie für den Rest weiterhin '...' verwenden und andere Anführungszeichen verwenden, die ' wie "'" oder \' oder (sofern verfügbar) $'\'' zitieren können:

    echo 'This is "tricky", isn'\''t it?'
    
  • Verwenden Sie die moderne $(...) Form der Befehlssubstitution. Verwenden Sie nur den alten `...`, um die Kompatibilität mit der Bourne-Shell zu gewährleisten, dh mit einem sehr alten System, und nur in Variablenzuweisungen, wie in Verwenden Sie nicht:

    echo "`echo "foo bar"`"
    

    Was mit den Bourne Shell- oder AT & T-Versionen von ksh nicht funktioniert. Oder:

    echo "`echo \"foo bar\"`"
    

    Was mit Bourne und AT & T ksh funktioniert, aber nicht mit yash, sondern mit:

    var=`echo "foo bar"`; echo "$var"
    

    das wird mit allen funktionieren.

    Es ist auch unmöglich, sie portabel mit doppelten Anführungszeichen zu verschachteln. Verwenden Sie daher auch hier Variablen. Achten Sie auch auf die spezielle Backslash-Verarbeitung:

    var=`printf '%s\n' '\\'`
    

    Speichert nur einen Backslash in $var, da in Backticks eine zusätzliche Ebene der Backslash-Verarbeitung (für \, `und $ (und auch ", wenn in yash angegeben)) innerhalb von Backticks vorhanden ist

    var=`printf '%s\n' '\\\\'`
    

    oder

    var=`printf '%s\n' '\\\'
    

    stattdessen.

Csh Familie

csh und tcsh haben eine deutlich unterschiedliche Syntax, obwohl die Bourne Shell noch viele Gemeinsamkeiten aufweist, da sie ein gemeinsames Erbe haben.

Spezielle Charaktere:

  • "\'&|;()^`<>$, Leerzeichen, Zeilenumbruch und Tabulator sind überall etwas Besonderes, wenn sie nicht in Anführungszeichen gesetzt werden.
  • # (csh ist die Shell, die # als Kommentarführer eingeführt hat) ist etwas Besonderes am Anfang eines Skripts oder nach einem nicht zitierten Leerzeichen, Tabulator oder Zeilenumbruch.
  • *?[ sind speziell als Globbing-Operatoren in Listenkontexten
  • {non-empty-string} ist etwas Besonderes (csh ist die Shell, die die Klammererweiterung eingeführt hat).
  • ! und ^ sind im Rahmen der Verlaufserweiterung (wieder eine csh-Erfindung) speziell, und Anführungsregeln sind speziell.
  • ~ (Tilde-Erweiterung auch eine csh-Erfindung) ist in einigen Zusammenhängen etwas Besonderes.

Operatoren zitieren

Sie sind die gleichen wie für die Bourne Shell, aber das Verhalten ist unterschiedlich. tcsh verhält sich aus syntaktischer Sicht wie csh. Sie werden feststellen, dass viele Versionen von csh böse Fehler aufweisen. Holen Sie sich die neueste Version von tcsh, um eine ungefähr funktionierende Version von csh zu erhalten.

  • \ maskiert ein einzelnes Zeichen mit Ausnahme von Zeilenumbruch (wie bei der Bourne-Shell). Es ist der einzige Anführungszeichen-Operator, der ! entkommen kann. \<newline> entgeht ihm nicht, sondern wandelt ihn von einem Befehlstrennzeichen in ein Token-Trennzeichen (wie Leerzeichen) um.
  • "..." entgeht allen Zeichen außer sich selbst, $, `, newline und !. Im Gegensatz zur Bourne-Shell können Sie \ nicht verwenden, um $ und ` in "..." zu maskieren, aber Sie können \ verwenden, um ! oder newline zu entkommen (aber nicht selbst, außer vor einem ! oder einer neuen Zeile). Ein Literal ! ist "\!" und ein Literal \! ist "\\!".
  • '...' entgeht allen Zeichen außer sich selbst, ! und newline. Wie bei doppelten Anführungszeichen können ! und newline mit einem Backslash maskiert werden.
  • die Befehlssubstitution erfolgt nur über die Syntax `...` und kann kaum zuverlässig verwendet werden.
  • die variable Substitution ist auch ziemlich schlecht gestaltet und fehleranfällig. Ein $var:q -Operator hilft dabei, zuverlässigeren Code mit Variablen zu schreiben.

Zusammenfassung

Halte dich von csh fern, wenn du kannst. Wenn Sie nicht verwenden können:

  • einfache Anführungszeichen, um die meisten Zeichen zu zitieren. ! und newline benötigen noch einen \.
  • \ kann den meisten Zeichen entkommen
  • "..." kann einige Erweiterungen zulassen, aber das ist ziemlich fehlerhaft, wenn sie Zeilenumbrüche und/oder Backslash-Zeichen einbetten. Verwenden Sie am besten nur einfache Anführungszeichen und $var:q für die variable Erweiterung. Sie müssen Schleifen verwenden, wenn Sie Elemente eines Arrays zuverlässig verbinden möchten.

rc Familie

rc ist die plan9 Shell und wurde wie ihre Nachkommen es und akanga auf Unix und Unix-Likes portiert. Das ist eine Shell mit einer viel saubereren und besseren Syntax, die jeder verwenden würde, wenn wir aus Gründen der Abwärtskompatibilität nicht an Bourne-ähnlichen Shells festhalten würden.

rc/akanga

Spezielle Charaktere

  • #;&|^$=`'{}()<>, SPC, TAB und NEWLINE sind immer etwas Besonderes, wenn sie nicht in Anführungszeichen stehen.
  • *?[ sind Globbing-Operatoren.

Anführungszeichen

'...' ist der einzige Anführungszeichen. Ein Wurf ' wird mit '' in einfache Anführungszeichen geschrieben wie in:

 echo 'it''s so simple isn''t it?'

es

es könnte als experimentell Shell angesehen werden, die auf rc basiert.

Es gibt jedoch einige Unterschiede. Das Interessante für diese Frage/Antwort ist, dass \ auch ein Anführungszeichen-Operator ist (der alle Sonderzeichen außer Newline zitiert) und auch zum Einfügen von Escape-Sequenzen wie \n für Newline, \b für Backslash ... verwendet werden kann.

fisch

fisch ist ein relativer Neuling (circa 2005), ist hauptsächlich für den interaktiven Gebrauch gedacht und hat auch eine deutlich andere Syntax als andere Muscheln.

spezielle Charaktere

  • "'\()$%{}^<>;&| immer speziell, wenn nicht in Anführungszeichen gesetzt (beachten Sie den % (für die PID-Erweiterung) als signifikanten Unterschied zu anderen Shells, und ` ist nicht speziell).
  • # (Kommentar) speziell, wenn Sie nicht zitierten Leerzeichen, Tabulatoren, Zeilenumbrüchen oder ;&|^<> folgen
  • *? (aber nicht [...]) Globbing-Operatoren

Operatoren zitieren

  • \ zitiert ein einzelnes Sonderzeichen mit Ausnahme von Zeilenumbruch. Beachten Sie jedoch, dass es auch als C-Escape-Sequenz (\n, \b...) einführt. IOW, \n ist kein zitiertes n, sondern eine neue Zeile.
  • "..." zitiert alles außer sich selbst, $ und Backslash und Backslash können verwendet werden, um diesen zu entkommen. \<newline> ist eine Zeilenfortsetzung (entfernt) in "...".
  • '...' zitiert alles außer sich selbst und \, und Sie können Backslash verwenden, um diesen zu entkommen.
27

1. Flucht

Entkomme all diesen Zeichen mit einem \, wie folgt (funktioniert nicht bei Zeilenumbrüchen/Wagenrückläufen):

$ echo Use a \"\\\" symbol to escape characters.
Use a "\" symbol to escape characters.

2. Doppelte Anführungszeichen

Fügen Sie den gesamten Text in "s, so:

$ var=variables;echo "Enclose text in \"s. You can also use $var in them. `echo Surprise!!!`"
Enclose text in "s. You can also use variables in them. Surprise!!!

3. Einfaches Anführungszeichen

Wie doppeltes Anführungszeichen, aber es gibt kein spezielles Token.

$ proof=proveit;echo 'This should not read "proveit": $proof'
This should not read "proveit": $proof
4
EKons