-
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"hacemysqlejecutar comandos desde un archivo cuyo nombre es el valor de$c. Lo que estás buscando esprintf '%s\n' "$c" | mysqlo más simple, siempre y cuando recuerdes las restricciones (
$cno debe comenzar con un-, y si contiene\eso está bien en bash pero no en otras variantes de sh)echo "$c" | mysqlHay otra alternativa que es más cómoda si el comando es multilínea. Se llama un "documento aquí". La cadena
EOFno es especial (aunque es tradicional), cualquier secuencia de letras y dígitos servirá. ElEOFterminal 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;