
Quero criar um script bash com consulta:
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"`
Meu resultado na tabela:
[TEXT,TEXT,TEXT]
Preciso:
["TEXT","TEXT","TEXT"]
Como corrigi-lo?
Responder1
Quando você inicia uma string entre aspas duplas ( "
), a string entre aspas termina no primeiro, sem escape, "
é encontrado. Em outras palavras, depois de eliminar as aspas, o argumento -e
lentamente se torna este:
"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
Mas como não há espaços entre aspas, o shell os reúne em um único argumento.
Portanto você precisa escapar "
dentro de uma string delimitada por aspas duplas ( "
). ou seja
mysql -D $Database -u $User -p$Password \
-e "UPDATE example SET example='[\"TEXT\",\"TEXT\",\"TEXT\"]' WHERE example='example';"
Exemplos extras:
$ 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
Yay! Funciona. Quando você escapa (adiciona um \
antes de um caractere) das aspas duplas, elas se tornam parte do argumento.
Agora, um exemplo de como isso pode dar errado:
$ perl -e 'print "$ARGV[0]\n"' "yay "yay" yay"
yay yay yay
$ perl -e 'print "$ARGV[0]\n"' "yay "yay "yay"
yay yay
No último exemplo os argumentos foram divididos porque existe um espaço que não foi citado. O que foram aspas são "yay "
(no início) e "yay"
(no final).