Script Bash/consulta Mysql

Script Bash/consulta Mysql

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 -elentamente 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).

informação relacionada