
Ich möchte ein Bash-Skript mit der Abfrage erstellen:
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"`
Mein Ergebnis in der Tabelle:
[TEXT,TEXT,TEXT]
Ich muss:
["TEXT","TEXT","TEXT"]
Wie man es repariert?
Antwort1
Wenn Sie einen in Anführungszeichen gesetzten String mit doppelten Anführungszeichen ( ) beginnen, "
endet der in Anführungszeichen gesetzte String mit dem ersten, nicht maskierten "
gefundenen Zeichen. Mit anderen Worten, nach dem Entfernen der Anführungszeichen -e
wird das Argument nach langsam zu folgendem:
"UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"
UPDATE example SET example='[TEXT","TEXT","TEXT"]' WHERE example='example';" # dropped first quotes
UPDATE example SET example='[TEXT,TEXT","TEXT"]' WHERE example='example';" # drop 2nd quotes (",")
UPDATE example SET example='[TEXT,TEXT,TEXT"]' WHERE example='example';" # drop 3rd (",")
UPDATE example SET example='[TEXT,TEXT,TEXT]' WHERE example='example'; # drop last
Da sich innerhalb der Anführungszeichen jedoch keine Leerzeichen befinden, fasst die Shell sie zu einem einzigen Argument zusammen.
"
Daher müssen Sie innerhalb einer durch Anführungszeichen ( ) abgegrenzten Zeichenfolge escapen "
. ie
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='[\"TEXT\",\"TEXT\",\"TEXT\"]' WHERE example='example';"
Weitere Beispiele:
$ echo yay
yay
$ echo "yay"
yay
$ echo "yay yay"
yay yay
$ echo "yay 'yay' yay"
yay 'yay' yay
$ echo "yay 'yay yay yay' yay"
yay 'yay yay yay' yay
$ echo "yay 'yay "yay" yay' yay"
yay 'yay yay yay' yay
$ echo "yay 'yay \"yay\" yay' yay"
yay 'yay "yay" yay' yay
Juhu! Es funktioniert. Wenn Sie \
die Anführungszeichen maskieren (ein vor ein Zeichen setzen), werden sie Teil des Arguments.
Nun ein Beispiel, wie das schiefgehen kann:
$ perl -e 'print "$ARGV[0]\n"' "yay "yay" yay"
yay yay yay
$ perl -e 'print "$ARGV[0]\n"' "yay "yay "yay"
yay yay
Im letzten Beispiel wurden die Argumente getrennt, da ein Leerzeichen nicht in Anführungszeichen gesetzt wurde. In Anführungszeichen gesetzt wurden "yay "
(am Anfang) und "yay"
(am Ende).