420 Stimmen

Wie kann ich ein doppeltes Anführungszeichen innerhalb von doppelten Anführungszeichen vermeiden?

Wie kann ich doppelte Anführungszeichen innerhalb einer doppelten Zeichenfolge in Bash entkommen?

Zum Beispiel, in meinem Shell-Skript

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

Ich kann nicht die ENCLOSED BY '\"' mit doppelten Anführungszeichen, um korrekt zu entkommen. Ich kann keine einfachen Anführungszeichen für meine Variable verwenden, denn ich möchte die Variable $dbtable .

393voto

Peter Punkte 120325

Verwenden Sie einen Backslash:

echo "\""     # Prints one " character.

150voto

kenorb Punkte 134883

Ein einfaches Beispiel für das Ausbrechen von Anführungszeichen in der Shell:

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

Dazu wird eine bereits geöffnete Datei beendet ( ' ), indem man den entflohenen ( \' ), und dann ein weiteres öffnen ( ' ).

Alternativ dazu:

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

Dies geschieht durch das Beenden eines bereits geöffneten ( ' ), ein Zitat in ein anderes Zitat setzen ( "'" ), und dann ein weiteres öffnen ( ' ).

Weitere Beispiele: Einfache Anführungszeichen innerhalb von Zeichenketten in einfachen Anführungszeichen umgehen

93voto

George Vasiliou Punkte 5810

Beachten Sie, dass Sie das Escaping vermeiden können, indem Sie die ASCII-Codes der Zeichen verwenden, die Sie als Echo benötigen.

Beispiel:

echo -e "This is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"
This is "'"'"text"'"'"

\x22 ist der ASCII-Code (in hex) für doppelte Anführungszeichen und \x27 für einfache Anführungszeichen. In ähnlicher Weise können Sie jedes Zeichen als Echo verwenden.

Ich vermute, wenn wir versuchen, die obige Zeichenkette mit Backslashes zu echoen, brauchen wir ein unordentliches zweizeiliges Backslashed-Echo... :)

Für die Variablenzuweisung ist dies das Äquivalent:

a=$'This is \x22text\x22'
echo "$a"

# Output:
This is "text"

Wenn die Variable bereits von einem anderen Programm gesetzt wurde, können Sie trotzdem doppelte/einfache Anführungszeichen mit sed oder ähnlichen Werkzeugen verwenden.

Beispiel:

b="Just another text here"
echo "$b"

 Just another text here

sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
 Just another "0" here #this is not what i wanted to be

sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"

 Just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.

37voto

Beetle Punkte 1869

Mit Bash können Sie Strings nebeneinander platzieren, die dann einfach zusammengeklebt werden.

Also dies:

echo "Hello"', world!'

produziert

Hello, world!

Der Trick besteht darin, je nach Bedarf zwischen Zeichenfolgen in einfachen und doppelten Anführungszeichen zu wechseln. Leider wird das schnell sehr unübersichtlich. Zum Beispiel:

echo "I like to use" '"double quotes"' "sometimes"

produziert

I like to use "double quotes" sometimes

In Ihrem Beispiel würde ich es etwa so machen:

dbtable=example
dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
echo $dbload

was die folgende Ausgabe ergibt:

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

Es ist schwer zu erkennen, was hier vor sich geht, aber ich kann es mit Unicode-Anführungszeichen kommentieren. Das Folgende wird in der Bash nicht funktionieren - es dient nur zur Veranschaulichung:

dbload= ' load data local infile " '" 'gfpoint.csv' "' " into '" table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY ' "' " '" ' LINES "' TERMINATED BY " '" '\n' "' " IGNORE 1 LINES '

Die Anführungszeichen wie " ' ' " im obigen Text werden von der Bash interpretiert. Die Anführungszeichen wie " ' in die resultierende Variable einfließen wird.

Wenn ich das frühere Beispiel genauso behandle, sieht es wie folgt aus:

echo " I like to use " ' "double quotes" ' " sometimes "

34voto

12oclocker Punkte 361

Speichern Sie das doppelte Anführungszeichen in einer Variablen:

dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"

Ausgabe:

Double quotes "X" inside a double quoted string

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X