如何将Linux Shell自定义变量传给MySQL命令并解决1064语法报错
故障根因
报错由两个核心问题导致:
- Shell单引号强引用机制:使用单引号包裹
-e参数后的SQL语句时,单引号内的${carname}不会被Shell解析替换为实际变量值,会原样字符串传递给MySQL。 - MySQL标识符语法规则:当数据库名、表名、字段名这类标识符包含连字符
-、空格或与MySQL保留字重名时,必须用*反引号()*包裹标识符,否则MySQL会将连字符识别为减法运算符,触发1064语法错误,也就是提示中near '-wp'`的报错来源。
注:执行时提示的
Using a password on the command line interface can be insecure是MySQL的安全警告,不是导致执行失败的原因,不影响语句实际运行。
正确执行命令
直接使用双引号包裹SQL语句(支持Shell变量展开),同时对包裹库名的MySQL反引号做转义,避免被Shell识别为命令替换标记:
# 先定义变量 carname=tesla-new # 执行MySQL命令 mysql -u wp-supportuser -h xx.xxx.xxx.xxx -p<mypassword>! -e "DROP DATABASE \`${carname}\`;"
如果是循环遍历值列表批量操作的场景,写法如下:
# 示例:遍历待删除的库名列表 for carname in tesla-new nio-new xpeng-new do mysql -u wp-supportuser -h xx.xxx.xxx.xxx -p<mypassword>! -e "DROP DATABASE IF EXISTS \`${carname}\`;" done
避坑说明
- 所有需要Shell解析替换变量的字符串,不要用单引号包裹,单引号是Shell强引用标记,内部变量、通配符都不会被展开。
- 只要MySQL标识符包含特殊字符或命中保留字,必须加反引号包裹,否则一定会出现语法解析错误。
- 如果需要消除命令行传密码的安全警告,可以将数据库账号密码配置到当前用户的
~/.my.cnf配置文件中,后续执行mysql命令不需要额外传-u、-p、-h参数即可连接。
内容的提问来源于stack exchange,提问作者animorph
相关产品推荐
相关产品推荐

