在mysql中插入用户定义变量创建用户

在mysql中插入用户定义变量创建用户,mysql,bash,shell,docker,Mysql,Bash,Shell,Docker,我想创建一个在docker CLI中运行的shell脚本,并使用作为命令行变量传递的主机IP创建一个MySQL用户。 所以我的脚本应该是/create_user.sh 172.17.0.1 我尝试从仅在sql语句部分插入变量开始,并使用如下内容: #!/bin/sh docker exec -i atb-mariadb bash <<'EOF' mysql -uroot -pmypass set @ip='172.17.0.1'; CREATE USER 'exporter'@@i

我想创建一个在docker CLI中运行的shell脚本,并使用作为命令行变量传递的主机IP创建一个MySQL用户。 所以我的脚本应该是
/create_user.sh 172.17.0.1

我尝试从仅在sql语句部分插入变量开始,并使用如下内容:

#!/bin/sh
docker exec -i atb-mariadb bash <<'EOF' 
mysql -uroot -pmypass
set @ip='172.17.0.1';
CREATE USER 'exporter'@@ip IDENTIFIED BY 'mypass';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1';
GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1';
SELECT user, host FROM mysql.user;
exit
EOF
当然,这只是脚本的sql语句部分中的变量。在整个shell脚本中使用一个变量并将其传递到sqlbash中,这是一个我还没有解决的问题

提前感谢您的帮助

已更新

我尝试了Raymond Nijland的解决方案,它适用于sql变量部分。但是,对于以下脚本,尝试通过命令行传递变量值仍然失败:

#!/bin/sh
echo script received $1
docker exec -e ipa=$1 -i atb-mariadb bash <<'EOF'
echo exec received $ipa
mysql -uroot -pmypass -e "
SET @ip='${ipa}';
SET @createUser = 'CONCAT("CREATE USER exporter@",@ip,"IDENTIFIED BY'mypass'")';
PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;";
exit
EOF

据我所知,通常的方法是使用-e句柄运行一个单独的.sql脚本文件,但不幸的是,将此文件绑定到默认的mariadb容器或创建自定义映像都是不可能的,因为当前的要求。

您应该能够使用CONCAT生成动态sql语句,准备并执行它们

查询

SET @ip = '172.17.0.1';

SET @createUser = CONCAT(
            "CREATE USER exporter@",@ip, " IDENTIFIED BY 'mypass'" 
          );

PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;

您应该能够使用CONCAT生成动态SQL语句,准备并执行它们

查询

SET @ip = '172.17.0.1';

SET @createUser = CONCAT(
            "CREATE USER exporter@",@ip, " IDENTIFIED BY 'mypass'" 
          );

PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;

在查询中使用变量之前,需要从shell中获取该变量。我认为您正在寻找类似(确保从EOF中删除引号):

#/垃圾箱/垃圾箱

docker exec-i atb mariadb bash在查询中使用变量之前,需要从shell中获取变量。我认为您正在寻找类似(确保从EOF中删除引号):

#/垃圾箱/垃圾箱

docker exec-i atb mariadb bash您是否尝试过在mysql workbench这样的编辑器中运行查询?错误输出是什么?您是否尝试过在mysql workbench这样的编辑器中运行查询?错误输出是什么?我尝试了这个,但得到了:
$。/create\u user.sh bash:line 4:GRANT:command not found bash:line 5:GRANT:command not found bash:line 6:SELECT:command not found mysql-uroot-pmypass create user exporter@由mypass标识
我尝试了这个,但得到了:
$。/create\u user.sh bash:line 4:GRANT:command找不到bash:line 5:GRANT:command未找到bash:line 6:SELECT:command未找到mysql-uroot-pmypass CREATE USER exporter@IDENTIFIED BY mypass
SET @ip = '172.17.0.1';

SET @createUser = CONCAT(
            "CREATE USER exporter@",@ip, " IDENTIFIED BY 'mypass'" 
          );

PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;
#!/bin/sh
docker exec -i atb-mariadb bash <<EOF
ip="${1:-127.0.0.1}"
echo mysql -uroot -pmypass
echo CREATE USER 'exporter'@'${ip}' IDENTIFIED BY 'mypass';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1';
GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1';
SELECT user, host FROM mysql.user;
exit
EOF