Wie kann ich doppelte Anführungszeichen in einer doppelten Zeichenfolge in Bash umgehen?
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 das ENCLOSED BY '\"'
mit doppeltem Anführungszeichen nicht richtig entkommen lassen. Ich kann keine einfachen Anführungszeichen für meine Variable verwenden, da ich eine Variable verwenden möchte $dbtable
.
$dbtable
, besteht ein Risiko. Dies wäre jedoch sehr ungewöhnlich, da Endbenutzer normalerweise kein SSH auf einen Computer ausführen, um ihre Daten zu laden.Antworten:
Verwenden Sie einen Backslash:
quelle
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
gibt kaputt wohingegen... [ -f "$(which $x)" ]; ...
oder... [ -f $(which "$x") ]; ...
funktioniert gut. Probleme würden auftreten, wenn entweder$x
oder das Ergebnis von$(which "$x")
etwas mit einem Leerzeichen oder einem anderen besonderen Charakter ergibt. Eine Problemumgehung verwendet eine Variable, um das Ergebnis von zuwhich
speichern, aber ist bash wirklich nicht in der Lage, einem Zitat zu entkommen, oder mache ich etwas falsch?grep -oh "\"\""$counter"\""\w*"
als Teil einer Bash-Syntax zu verwenden, wobei in$counter
eine Variable ist. es mag es keine GedankenEin einfaches Beispiel für das Entkommen von Anführungszeichen in der Shell:
Dazu beenden Sie ein bereits geöffnetes (
'
), platzieren das entkommene (\'
) und öffnen dann ein weiteres ('
).Alternative:
Dazu beenden Sie bereits geöffnetes (
'
), setzen ein Zitat in ein anderes Zitat ("'"
) und öffnen dann ein anderes ('
).Weitere Beispiele: Escapezeichen in einfachen Anführungszeichen in Zeichenfolgen in einfachen Anführungszeichen
quelle
echo "abc\"abc"
reicht aus, umabc"abc
wie in Peter Antwort zu produzieren.Ich weiß nicht, warum dieses alte Problem heute in den mit Bash-Tags versehenen Listen aufgetaucht ist, aber denken Sie für den Fall zukünftiger Forscher daran, dass Sie die Flucht vermeiden können, indem Sie ASCII-Codes der Zeichen verwenden, die Sie wiederholen müssen.
Beispiel:
\x22
ist der ASCII-Code (in hexadezimaler Schreibweise) für doppelte und\x27
einfache Anführungszeichen. Ebenso können Sie jedes Zeichen wiedergeben.Ich nehme an, wenn wir versuchen, die obige Zeichenfolge mit Backslashes wiederzugeben, benötigen wir ein unordentliches Backslashed-Echo mit zwei Zeilen ... :)
Für die Variablenzuweisung ist dies das Äquivalent:
Wenn die Variable bereits von einem anderen Programm festgelegt wurde, können Sie mit sed oder ähnlichen Tools weiterhin doppelte / einfache Anführungszeichen anwenden.
Beispiel:
quelle
echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
Mit Bash können Sie Saiten nebeneinander platzieren, und sie werden einfach zusammengeklebt.
Also das:
produziert
Der Trick besteht darin, je nach Bedarf zwischen einfachen und doppelten Zeichenfolgen zu wechseln. Leider wird es schnell sehr chaotisch. Beispielsweise:
produziert
In Ihrem Beispiel würde ich es ungefähr so machen:
welches die folgende Ausgabe erzeugt:
Es ist schwer zu erkennen, was hier vor sich geht, aber ich kann es mit Unicode-Anführungszeichen kommentieren. Folgendes funktioniert in Bash nicht - 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 "''" oben werden von bash interpretiert. Die Zitate mögen
" '
werden in der resultierenden Variablen enden.Wenn ich das vorherige Beispiel gleich behandle, sieht es so aus:
$ echo
"I like to use
""
"double quotes"
""
sometimes
"quelle
Check out printf ...
Ohne printf
Ausgabe: Sag "Hallo"
Mit printf
Ausgabe: Sagen Sie "Hallo".
quelle
printf
mehr Zeichen als auch, wie entkommt'
,(
und)
printf %q
generiert Zeichenfolgen, die bereit sindeval
, nicht formatiert sindecho -e
.printf
mit einer nutzlosen Verwendung vonecho
zu verpacken . Ihre beiden Beispiele haben das Zitat gebrochen. Die richtige Lösung besteht darin, die Variable in doppelte Anführungszeichen zu setzen.Speichern Sie das doppelte Anführungszeichen als Variable:
Ausgabe:
quelle
Verwenden Sie $ "string".
In diesem Beispiel wäre es,
Hinweis (von der Manpage ):
quelle
Fügen Sie
"\"
vor dem doppelten Anführungszeichen hinzu, um es zu umgehen, anstatt\
quelle
csh
Antwort auf einebash
Frage? Die beiden sind völlig verschieden und inkompatibel.