Bashスクリプト/Mysqlクエリ

Bashスクリプト/Mysqlクエリ

クエリを使用してbashスクリプトを作成したいと思います。

mysql -D $Database -u $User -p$Password \
      -e "UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"`

私の結果は表に示されています。

[TEXT,TEXT,TEXT]

以下を行う必要があります。

["TEXT","TEXT","TEXT"]

どうすれば修正できますか?

答え1

二重引用符()で引用符付き文字列を開始すると、引用符付き"文字列は最初にエスケープされていない最初の"クエリで終了します。つまり、引用符を削除した後、引数は-eゆっくりと次のようになります。

"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

ただし、引用符内にスペースがないため、シェルはこれを単一の引数に結合します。

"したがって、二重引用符()で区切られた文字列内でエスケープする必要があります"。今すぐ

mysql -D $Database -u $User -p$Password \
      -e "UPDATE example SET example='[\"TEXT\",\"TEXT\",\"TEXT\"]' WHERE example='example';"

追加例:

$ 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

うん!効果がある二重引用符をエスケープ(\文字の前に追加)すると、パラメータの一部になります。

今、これがどのように間違っている可能性があるかの例は次のとおりです。

$ perl -e 'print "$ARGV[0]\n"' "yay "yay" yay"
yay yay yay

$ perl -e 'print "$ARGV[0]\n"' "yay "yay "yay"
yay yay

最後の例では、引用符で囲まれていないスペースがあるため、引数が分割されます。引用符は"yay "(最初に)と"yay"(最後に)です。

関連情報