Wie kann man Apostroph in einfach zitierten Strings in Bash umgehen?

17

Ich verstehe nicht, wie Bash das Entkommen von Apostroph-Zeichen in Strings in einfachen Anführungszeichen bewertet.

Hier ist ein Beispiel:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Ich habe versucht, nach Erklärungen zu suchen, konnte aber nichts bekommen. Was macht Bash hier?

Kibet
quelle
echo \''Hello World'\'
Mathe

Antworten:

18

In einfachen Anführungszeichen ist kein Ausweichen möglich. Es gibt keine Möglichkeit, ein einfaches Anführungszeichen in einfache Anführungszeichen einzufügen. Siehe Zitieren in Man Bash .

Choroba
quelle
1
Du hast recht. Der Trick ist in dieser Zeile: "Ein einzelnes Anführungszeichen darf nicht zwischen einzelnen Anführungszeichen stehen, auch wenn ein Backslash vorangestellt ist." Also wird es wahrscheinlich in verschiedene Teile aufgeteilt.
Kibet
@Colin Sobald sich ein einfaches Anführungszeichen in zwei anderen einfachen Anführungszeichen befindet (jedoch mit einem Backslash versehen), ist das zitierte Anführungszeichen kein echtes Anführungszeichen mehr. Es ist nur ein Zeichen ohne besondere Paarungseigenschaften.
zero2cx
1
@ zero2cx: Nicht wahr:echo '\''
Choroba
@ zero2cx: Ich würde "draussen" statt "drinnen" sagen.
Choroba
3
@choroba nicht "ganz" wahr, in der Bash können Sie tunecho $'\'hello world\''
bufh
8

Liefert neben POSIX-unterstützten einfachen und doppelten bashAnführungszeichen einen zusätzlichen Anführungszeichentyp, um eine kleine Klasse von maskierten Zeichen (einschließlich eines einfachen Anführungszeichens) in einer Zeichenfolge in Anführungszeichen zuzulassen:

$ echo $'\'Hello World\''
'Hello World'

Weitere Informationen finden Sie im Abschnitt QUOTING auf der bashManpage am Ende des Abschnitts. (Suchen Sie nach "ANSI C".)

chepner
quelle
3

Um zu erklären, was mit Ihren maskierten Apostrophen passiert, untersuchen wir Ihr zweites Beispiel (siehe auch einfache Anführungszeichen oder starke Anführungszeichen ):

$ echo '\'Hello World\''
>     # expects you to continue input

Hier haben Sie das Zitat hängen gelassen, wie Sie angegeben haben. Jetzt schneide das Ende zu und ändere es in:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

Die Unterzeichenfolge "Hello World" wurde hier nicht in Anführungszeichen gesetzt, hat sich jedoch so verhalten, als wäre sie in Anführungszeichen gesetzt. Verwenden Sie Ihr Beispiel erneut und schneiden Sie das Ende dieses Mal anders ab:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

Die Unterzeichenfolge "Hello World" verhält sich wieder so, als wäre sie in Anführungszeichen gesetzt, wobei am Ende nur das hinzugefügte Apostroph (ohne Anführungszeichen) steht.

Wenn am Ende ein weiteres einfaches Anführungszeichen hinzugefügt wird (Ihr ursprüngliches Beispiel), bleibt die Zeichenfolge hängen und wartet auf ein genaues Anführungszeichen.

zero2cx
quelle
3

Einfaches Beispiel für das Entziehen von Anführungszeichen in der Shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Schließen Sie dazu eine bereits geöffnete ( '), platzieren Sie eine mit Escape-Zeichen versehene ( ), um sie \'zu drucken, und öffnen Sie dann eine andere ( ').

Alternative:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Sie beenden das bereits geöffnete ( '), platzieren das Zitat in einem anderen Zitat ( "'") und öffnen dann ein anderes ( ').

Was du getan hast ( '\'Hello World\''), ist:

  1. 1. Apostroph geöffnet: '.
  2. Geschlossen rechts , nachdem er \', so dass die Zeichenfolge wird: '\'.
  3. Hello World ist keine Anführungszeichen.
  4. Standalone-Apostroph ( \') platziert, ohne es zu öffnen.
  5. Das letzte Apostroph ( ') öffnet die Zeichenfolge, aber es gibt keine schließende Zeichenfolge, die erwartet wird.

Das richtige Beispiel wäre also:

$ echo \'Hello World\'
'Hello World'

Verwandte Themen: Wie vermeide ich einfache Anführungszeichen innerhalb von Zeichenfolgen in einfachen Anführungszeichen?

Kenorb
quelle