Script Bash / consulta MySQL

1

Eu 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]

Eu preciso:

["TEXT","TEXT","TEXT"]

Como consertar isso?

    
por J.Doy 26.09.2016 / 03:07

1 resposta

2

Quando você inicia uma cadeia de caracteres entre aspas com aspas duplas ( " ), a cadeia entre aspas termina no primeiro, sem escape, " is encontra. Em outras palavras, depois de eliminar as aspas, o argumento depois de -e se torna isso lentamente:

"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 dentro das aspas, o shell coloca-os juntos em um único argumento.

Portanto, você precisa escapar de " 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) as 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 há um espaço que não foi citado. O que tem sido aspas são "yay " (no início) e "yay" (no final).

    
por 26.09.2016 / 03:20