mysql - bash 脚本中的 SQL 语法错误

标签 mysql sql bash cacti

我有一个脚本,主要用于创 build 备、图形和树,并尝试为 Cacti 图形软件创建用户。

尝试运行 shell 脚本时收到以下 SQL 错误。然而,直接将完全相同的输入语句复制并粘贴到 MySQL 中,它会接受语法。

ERROR 1064 (42000) at line 3: 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 ''TestName','cf199661b212c55286cf81d9602ce63','0', 'TestFullName','on','on','' at line 1

下面的脚本是如何实现的

php add_device.php --description=$1 --ip=$2 --community=community --template=5 --ping_method=icmp
mysql -u root cacti -ppassword -e "select id from host where description='$1'" | grep -v id > tempID
php add_tree.php --type=node --node-type=host --tree-id=3 --parent-node=34 --host-group-style=2 --host-id=`cat tempID`
php add_graphs.php --host-id=`cat tempID` --graph-type=ds --graph-template-id=2 --snmp-query-id=1 --snmp-query-type-id=14 --snmp-field=ifOperStatus --snmp-value=Up
mysql -u root cacti -ppassword -e "select MAX(id) FROM user_auth" | grep -v id > tempUserID
Number=`cat tempUserID`
User_IDD= $(($Number + 1))
Host_ID=`cat tempID`


mysql -uroot -ppassword cacti << EOF



INSERT INTO user_auth (id,username,password,realm,full_name,must_change_password,show_tree,show_list,show_preview,graph_settings,login_opts,policy_graphs,policy_trees,policy_hosts,policy_graph_templates,enabled) V
ALUES($User_IDD,'$3','cf199661b212c55286cf81d9602ce630',0,'$4','on','on','on','on','on',1,2,2,2,2,'on');
INSERT INTO user_auth_perms (user_id,item_id,type) VALUES ($User_IDD,$Host_ID,3);
INSERT INTO user_auth_realm (realm_id,user_id) VALUES (7,$User_IDD);

EOF

rm TempUserID
rm TempID
~

直接粘贴到命令行中的确切 SQL 插入语句的功能示例如下

INSERT INTO user_auth 
        (id, username, password, realm, full_name, must_change_password, show_tree, show_list, show_preview, graph_settings, login_opts, policy_graphs, policy_trees, policy_hosts, policy_graph_templates, enabled) 
VALUES  
(       38, 
        'Test', 
        'cf199661b212c55286cf81d9602ce63',
        '0',
        'TestUser',
        'on',
        'on',
        'on',
        'on',
        'on',
        1,
        2,
        2,
        2,
        2,
        'on'
);

INSERT INTO user_auth_perms 
        (user_id, item_id, type) 
VALUES  (38, 285, 3);

INSERT INTO user_auth_realm 
        (realm_id, user_id) 
VALUES  (7, 38);

我已经为此绞尽脑汁好几天了,但我无法完全找到我的语法中的问题,有人看到任何完全错误的地方吗?

最佳答案

听起来发生的事情是您在脑海中“运行”脚本,发现它运行良好,然后当计算机不同意时就会卡住。

调试时,您不应该在计算机上运行脚本:不要复制粘贴 SQL,然后将变量替换为您认为应该的变量。

相反,让计算机运行脚本:让它输出 SQL,然后观察它是否符合您的预期。

您可以通过将 mysql -uroot -ppassword cacti 替换为 cat 来实现此目的,这将使脚本吐出结果而不是执行它。你会看到它是这样的:

INSERT INTO user_auth (id,username,password,realm,full_name, [snip]) 
VALUES(,'baz','cf199661b212c55286cf81d9602ce630',0,'cow','on','on',[snip]);

现在问题更加明显:VALUES(,'baz' 缺少第一个值。

要解决该问题,您可以仔细注意意外的错误消息。您会看到您得到的内容类似于:

42: command not found

您不应该忽略此类消息。当您将输出复制粘贴到 stackoverflow 时,您应该包含所有输出(如果太长,您应该减少脚本和输入数据的大小,而不是编辑您认为不相关的信息)。

你会发现错误发生在这一行:

User_IDD= $(($Number + 1))

为什么它说“找不到命令”而不是分配给变量?因为=后面有空格。 bash 中的赋值操作符周围不能有空格。

删除空格并重试。

我并不是说这足以解决脚本的所有问题,但这是一个好的开始。

PS:ShellCheck会自动指出错误的空间。

关于mysql - bash 脚本中的 SQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24704951/

相关文章:

php - 如何在 PHP 中正确处理小数?

mysql - 无法在 Docker-Compose 文件中将本地数据库映射到(mysql 镜像中的卷)

php - 如何使用 php 从 sql 中回显一厘米的最高值

sql - 在 Sql Server 中更新该字段后更改年份

mysql - 如果另一个字段包含字符串,则在 mysql 子选择中返回 true 或 false

bash - 当 'let' 表达式的计算结果为 0 时,为什么带有 -e 选项的 Bash 退出?

php - 使用 PDO 执行多个查询

sql - 具有即时模式和错误的 Oracle DDL 执行

linux - 我不明白为什么在 bash 中比较字符串时遇到问题

bash - 如何使用命令行 FTP 上传多个文件和目录?