Ошибка синтаксиса SQL из скрипта bash
У меня есть скрипт, который по сути создает устройства, графики и деревья, а также пытается создать пользователя для графического программного обеспечения Cacti.
Я получаю приведенную ниже ошибку 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);
Я уже несколько дней бьюсь головой об этом, и я не могу понять, что не так в моем синтаксисе. Кто-нибудь видит что-то прямо не так?
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
Вы не должны игнорировать такого рода сообщения. Когда вы копируете и вставляете выходные данные в stackru, вы должны включать все выходные данные (если они слишком длинные, вам следует уменьшить размер вашего сценария и входных данных, а не редактировать информацию, которую вы не считаете релевантной).
Вы обнаружите, что ошибка происходит в этой строке:
User_IDD= $(($Number + 1))
И почему вместо присвоения переменной вместо нее указывается "команда не найдена"? Из-за места после =
, Присваивания в bash не могут иметь пробелов вокруг оператора присваивания.
Удалите пробел и попробуйте снова.
Я не говорю, что этого достаточно, чтобы решить все проблемы с вашим сценарием, но это хорошее начало.
PS: ShellCheck автоматически указал бы на плохое место.