Bash-Skript/MySQL-Abfrage

Bash-Skript/MySQL-Abfrage

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 -ewird 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).

verwandte Informationen