编写Cron调度Shell脚本执行MySQL UPDATE时遇语法错误求助
解决Shell脚本中MySQL UPDATE语句的表名字法错误问题
问题核心:你在Shell命令的
--execute参数里用双引号包裹SQL时,反引号(`)会被Shell当作命令替换符解析,而非传递给MySQL作为标识符引号;另外用单引号包裹表名本身不符合MySQL语法——MySQL的表名、列名这类标识符需要用反引号,单引号仅用于包裹字符串。解决方案1:转义反引号
在双引号包裹的SQL语句中,给反引号加上反斜杠转义,让Shell将其视为普通字符传递给MySQL:mysql --user="username" --password="pass" --database="data" -s --execute="UPDATE \`lines\` SET allowed_outputs = '[1,2]';"解决方案2:用单引号包裹整个SQL语句
改用单引号包裹完整SQL,避免Shell解析内部的反引号,同时保持MySQL要求的反引号表名格式:mysql --user="username" --password="pass" --database="data" -s --execute='UPDATE `lines` SET allowed_outputs = "[1,2]";'这里把字符串
[1,2]改用双引号包裹,避免和外层单引号冲突。解决方案3:独立SQL文件执行(推荐复杂场景)
创建update_lines.sql文件,写入纯SQL内容:UPDATE `lines` SET allowed_outputs = '[1,2]';然后在Shell脚本中通过导入文件执行:
mysql --user="username" --password="pass" --database="data" -s < update_lines.sql这种方式彻底规避Shell引号解析问题,后续修改SQL逻辑也更直观。
内容的提问来源于stack exchange,提问作者Daniel Peters
相关产品推荐
相关产品推荐

