我有一个基本上创建设备,图形和树的脚本,以及尝试为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);
我几天来一直在反对这一点,我的语法中找不到什么错误,有没有人看到任何错误?
答案 0 :(得分:1)
听起来正如发生的那样,你正在“运行”你头脑中的脚本,发现它工作正常,然后在计算机不同意时卡住。
调试时,不应该为计算机运行脚本:不要复制粘贴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会自动指出坏空间。