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

引用符で囲んだ文字列を二重引用符 ( ) で始めると、"引用符で囲んだ文字列は、最初に見つかったエスケープされていない"is で終わります。つまり、引用符を削除すると、引数 after は-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

しかし、引用符内にスペースがないため、シェルはそれらを 1 つの引数にまとめます。

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

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

やった!うまくいきました。\二重引用符をエスケープ(文字の前に a を追加)すると、二重引用符は引数の一部になります。

これがどのように問題になるかの例を示します。

$ 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"(末尾) です。

関連情報