Это моя первая попытка передать команду bash в терминале mysql, я делаю это много:
создавая фиктивного пользователя каждый раз, когда я устанавливаю приложение для взаимодействия с базой данных.
однако все мои попытки не удались, и вот моя строка кода:
new_user(){ mysql -u"$1" -p"$2" -e 'CREATE USER "$3"@"$4" IDENTIFIED BY "$5";
GRANT ALL PRIVILEGES ON "$6".* TO "$3"@"$4";
FLUSH PRIVILEGES;
exit;' &&
echo 'new MySQL USER has been created ..
name:"$3" server:"$4" password:"$5" database:"$6"' ; }
однако, это дает мне эту ошибку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near '"$4".* TO "$1"@"$2"' at line 1
Я попытался использовать -e
но, как показано, не повезло.
как передать переменные bash в mysql?
благодаря комментариям, я обновил свой код для кавычек, однако я до сих пор не могу передать переменные в терминал mysql.
new_user() {
SQL="CREATE USER\"$3\"@\"$4\" IDENTIFIED BY \"$5\"; GRANT ALL PRIVILEGES ON \"$6\".* TO \"$3\"@\"$4\"; FLUSH PRIVILEGES; exit;"
mysql -uroot -p1 -e "$SQL" &&
echo new MySQL USER has been created .. name:\"$3\" server:\"$4\" password:\"$5\" database:\"$6\"
}
Вы можете избежать выяснения того, как избежать кавычек, используя HEREDOC
.
Для отладки, возможно, попробуйте разбить свою функцию на две части.
gen_user_sql(){
cat <<HEREDOC
CREATE USER '$1'@'$2' IDENTIFIED BY '$3';
GRANT ALL PRIVILEGES ON $4.* TO '$1'@'$2';
FLUSH PRIVILEGES;
HEREDOC
}
new_user(){
sqluser="$1"; shift
sqlpswd="$1"; shift
mysql -u"$sqluser" -p"$sqlpswd" -e "$(gen_user_sql $@)"
echo "new user: $@"
}
# see the query
gen_user_sql user host id db
# actually run it
new_user sqlu sqlp user host id db
некоторые заметки в случае появления нового синтаксиса:
$@
- все переменные, переданные в. shift
удаляет то, что было бы $1
от $@
. (после shift
, $1
возвращает то, что было $2
до shift
)$(command)
фиксирует вывод command
и в этом случае использует ее как ввод строки в mysql
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''database'.* TO 'user'@'localhost'' at line 1
пока пользователь создан; нет никаких привилегий. это ;
прошло также в HEREDOC
как переменные?
-e
мне не нужно выходить, так как я просто отправляю некоторые команды.
new_user() { SQL="CREATE USER\"$3\"@\"$4\" IDENTIFIED BY \"$5\"; GRANT ALL PRIVILEGES ON \"$6\".* TO \"$3\"@\"$4\"; FLUSH PRIVILEGES; exit;" mysql -uroot -p1 -e "$SQL" && echo new MySQL USER has been created .. name:\"$3\" server:\"$4\" password:\"$5\" database:\"$6\" }
однако переменные не были переданы в MySQL