Bash嵌套引号问题:Docker容器内MySQL全局变量设置失败
解决Docker exec嵌套引号导致MySQL语法错误的问题
问题原因
你遇到的ERROR 1064本质是嵌套引号解析冲突:bash -c参数用单引号包裹整个mysql命令,而mysql的SET语句里又用了单引号,bash会提前截断字符串,导致MySQL收到不完整的SQL语句,触发语法错误。
解决方案
方案1:bash单引号内嵌入单引号的标准写法
将MySQL语句中的单引号替换为'\''(bash中嵌入单引号的特殊语法:闭合当前单引号 → 输出一个单引号 → 重新开启单引号),修正后的命令:
docker exec abc bash -c 'mysql -e "SET GLOBAL clone_valid_donor_list = '\''10.18.111.76:3306'\'';"'
注意:Java执行时建议去掉
-it参数(交互式终端参数,非交互式场景无需),避免阻塞或输出异常。
对应Java代码中的命令字符串(需转义双引号):
String dockerCmd = "docker exec abc bash -c 'mysql -e \"SET GLOBAL clone_valid_donor_list = '\''10.18.111.76:3306'\'';\"'";
方案2:切换引号层级,用双引号包裹bash命令
将bash -c的外层包裹改为双引号,MySQL语句用单引号,同时转义内部的双引号,修正后的命令:
docker exec abc bash -c "mysql -e 'SET GLOBAL clone_valid_donor_list = \"10.18.111.76:3306\";'"
对应Java代码中的命令字符串(需转义双引号和内部的转义符):
String dockerCmd = "docker exec abc bash -c \"mysql -e 'SET GLOBAL clone_valid_donor_list = \\\"10.18.111.76:3306\\\";'\"";
两种方案都能让bash正确解析完整的MySQL命令,避免语法错误,且适合Java程序化一次性执行。
内容的提问来源于stack exchange,提问作者Calvin_Z
相关产品推荐
相关产品推荐

