2014-07-11 3 views
0

나는 기본적으로 장치, 그래프 및 트리를 생성하는 스크립트를 가지고 있으며 Cacti 그래프 소프트웨어 용 사용자를 생성하려고 시도합니다.SQL 구문 bash 스크립트의 오류

쉘 스크립트를 실행할 때 아래의 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 

는 아래의 스크립트는 내가 '

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); 

을 기능 예를 들어 다음과 같이이

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 삽입 명령 행에 직접 붙여 문입니다을 구현하는 방법이다 지금 며칠 동안 내 머리를 때려 눕히고 내 구문에서 무엇이 잘못되었는지를 아는 사람은 아무 것도 볼 수 없습니까?

+0

'{}'버튼을 코드 포맷팅에 사용해야합니다. – tadman

+0

게시 된 오류와 코드가 일치하지 않습니다. 오류를 던지는 실제 코드를 보여줍니다. – Rahul

답변

1

당신이 머리에서 스크립트를 "실행"하고있어 제대로 작동하는 것을 확인한 다음 컴퓨터가 동의하지 않을 때 막히는 경우가 있습니다.

디버깅 할 때 컴퓨터의 스크립트를 실행하면 안됩니다. SQL을 복사하여 붙여 넣기를 수행하지 말고 변수를 바꿔야한다고 생각하는 것으로 바꾸십시오.

대신 컴퓨터에서 스크립트를 실행하게하십시오. SQL을 출력 한 다음 예상 한 것과 일치하는지 관찰하십시오.

mysql -uroot -ppassword cacticat으로 바꾸면됩니다. 이렇게하면 스크립트를 실행하는 대신 결과가 누출됩니다.

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의 대입에는 대입 연산자 주변에 공백이 없어야합니다.

공간을 제거하고 다시 시도하십시오.

스크립트로 모든 문제를 해결하기에 충분하다고 말하는 것은 아니지만 시작하는 것이 좋습니다.

추신 : ShellCheck은 자동으로 잘못된 공간을 지적했습니다.