
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 -e
lentamente 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).