Script Bash/consulta Mysql

Script Bash/consulta Mysql

Quiero crear un script bash con la consulta:

mysql -D $Database -u $User -p$Password \
      -e "UPDATE example SET example='["TEXT","TEXT","TEXT"]' WHERE example='example';"`

Mi resultado en la tabla:

[TEXT,TEXT,TEXT]

Necesito:

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

¿Como arreglarlo?

Respuesta1

Cuando comienza una cadena entrecomillada con comillas dobles ( "), la cadena entrecomillada termina en la primera, sin escape, "que se encuentra. En otras palabras, después de eliminar las comillas, el argumento siguiente -elentamente se convierte en 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

Pero como no hay espacios entre las comillas, el shell los junta en un solo argumento.

Por lo tanto, es necesario escapar "dentro de una cadena delimitada por comillas dobles ( "). es decir

mysql -D $Database -u $User -p$Password \
      -e "UPDATE example SET example='[\"TEXT\",\"TEXT\",\"TEXT\"]' WHERE example='example';"

Ejemplos adicionales:

$ 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

¡Hurra! Funciona. Cuando escapa (agrega un \carácter antes de un carácter) de las comillas dobles, se convierten en parte del argumento.

Ahora un ejemplo de cómo esto puede salir mal:

$ perl -e 'print "$ARGV[0]\n"' "yay "yay" yay"
yay yay yay

$ perl -e 'print "$ARGV[0]\n"' "yay "yay "yay"
yay yay

En el último ejemplo se dividieron los argumentos porque hay un espacio que no ha sido citado. Lo que han sido comillas son "yay "(al principio) y "yay"(al final).

información relacionada