Когда вы начинаете цитируемую строку с двойных кавычек ("
), цитируемая строка заканчивается на первой, не заключенной в кавычки, "
находке. Другими словами, после удаления кавычек аргумент после -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
Но так как внутри кавычек нет пробелов, shell объединяет их в один аргумент.
Поэтому нужно заключить "
в строку, разделенную двойными кавычками ("
). т.е.
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"
(в конце).