-
Siempre ponga comillas dobles alrededor de sustituciones de variables, de lo contrario, caracteres como espacios y
*
que aparecen en el valor son interpretados por el shell. Es decir, escribe"$c"
, no$c
. -
La sintaxis
mysql <"$c"
hacemysql
ejecutar comandos desde un archivo cuyo nombre es el valor de$c
. Lo que estás buscando esprintf '%s\n' "$c" | mysql
o más simple, siempre y cuando recuerdes las restricciones (
$c
no debe comenzar con un-
, y si contiene\
eso está bien en bash pero no en otras variantes de sh)echo "$c" | mysql
Hay otra alternativa que es más cómoda si el comando es multilínea. Se llama un "documento aquí". La cadena
EOF
no es especial (aunque es tradicional), cualquier secuencia de letras y dígitos servirá. ElEOF
terminal puede no estar precedido por un espacio en blanco. Tienes que poner un\
antes de cada$
,\
y`
a menos que desee que el shell los interprete.mysql <<EOF GRANT ALL ON *.* TO '$1'@'localhost'; EOF
-
Tenga en cuenta que si el argumento del shell contiene una comilla simple, tiene un vector de inyección. El siguiente fragmento agrega un
\
antes de cada\
y'
.set -- "${1//\\/\\\\}" set -- "${1//\'/\'}"
Esto es bastante feo, por lo que si va a hacer algo complicado, olvídese de usar un shell y use un lenguaje con enlaces SQL reales (perl, python, lo que sea) donde la biblioteca maneja todas las cotizaciones y la creación de procedimientos por usted. .
Use comillas simples para su cadena:
c='GRANT ALL ON *.* TO';
c="${c} '$1'@'localhost';";
Probablemente haya una mejor manera de hacerlo, pero incluir $1 en la cadena lo hizo raro
Esto funcionará en bash, no es necesario escapar
#!/bin/bash
mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'"
exit 0;