
クエリを含む 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"
(末尾) です。