"자동화"생성 된 수입하는 과정을 .sql
통해 파일을 통과하려고에 숨겨진 할 수있는 모든 트랩을 피하면서 파일을, stdin
및 stdout
단지 생성 된 실행하기 위해 MySQL을 말할 .sql
사용하여 파일 SOURCE
의 MySQL의 명령을 사용합니다.
짧고,하지만 우수한에서 구문 대답은 ,에서 Kshitij 수드 , 가장 좋은 출발점을 제공합니다. 간단히 말해서 Kshitij Sood의 구문에 따라 OP의 명령을 수정하고 해당 명령을 다음 명령으로 바꿉니다 SOURCE
.
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
데이터베이스 이름이 생성 된 .sql
파일에 포함 된 경우 명령에서 삭제할 수 있습니다.
여기서 가정은 생성 된 파일이 자체 파일로 유효하다는 것 .sql
입니다. 쉘에서 파일을 경로 재 지정, 파이프 또는 기타 방식으로 처리하지 않아도 쉘로 인해 생성 된 출력에서 문자를 이스케이프 처리 할 필요가 없습니다. .sql
물론 파일 에서 이스케이프해야 할 것에 관한 규칙은 여전히 적용됩니다.
명령 줄이나 my.cnf
파일 등 의 암호와 관련된 보안 문제를 처리하는 방법 은 다른 답변으로 잘 해결되었습니다. 내 마음에 드는 대답 에서, 대니 , 커버를 처리 할 때 문제를 처리하는 방법을 포함하는, cron
작업, 또는 다른 것.
내가 언급 한 짧은 대답에 대한 의견 (질문?) 을 해결하려면 : 아니오, 해당 쉘 명령이 제공되므로 HEREDOC 구문과 함께 사용할 수 없습니다. I / O 리디렉션은 HEREDOC를 기반으로하기 때문에 HEREDOC은 옵션 없이 리디렉션 버전 구문에 사용할 수 있습니다 -Bse
. HEREDOC의 기능이 필요한 경우 .sql
파일이 임시 파일 인 경우에도 파일을 작성하는 데 사용하고 해당 파일을 "명령"으로 사용하여 MySQL 배치 라인에서 실행하는 것이 좋습니다.
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
쉘 확장으로 인해 HEREDOC 내에서 쉘 및 환경 변수를 사용할 수 있습니다. 단점은 각각의 백틱을 피해야한다는 것 입니다. MySQL은 식별자를 구분 기호로 사용하지만 문자열을 먼저 얻는 쉘은이를 실행 가능한 명령 구분 기호로 사용합니다. MySQL 명령의 단일 백틱에서 탈출을 놓치면 모든 것이 오류로 폭발합니다. HEREDOC에 대해 인용 된 LimitString을 사용하여 전체 문제를 해결할 수 있습니다.
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
그런 식으로 쉘 확장을 제거하면 백틱 및 기타 쉘 특수 문자를 벗어날 필요가 없습니다. 또한 쉘 및 환경 변수를 사용하는 기능도 제거합니다. 이는 쉘 스크립트 내부에서 HEREDOC을 사용하여 얻을 수있는 이점을 거의 제거합니다.
다른 옵션은 Bash에서 허용되는 여러 줄로 묶인 문자열을 배치 구문 버전 ()과 함께 사용하는 것 -Bse
입니다. 나는 다른 껍질을 알지 못하기 때문에 껍질이 잘 작동하는지 말할 수 없습니다. 어쨌든 다른 MySQL 명령처럼 종료 되지 않고 한 줄에 하나만 허용 되기 때문에 어쨌든 명령으로 둘 이상의 .sql
파일 을 실행하기 위해 이것을 사용해야합니다 . 여러 줄로 된 문자열은 셸 확장에 일반적인 영향으로 작은 따옴표 나 큰 따옴표로 묶을 수 있습니다. 또한 HEREDOC 구문을 사용하여 백틱 등에 사용하는 것과 동일한 경고가 있습니다.SOURCE
;
잠재적으로 더 나은 해결책은 스크립트 언어, Perl, Python 등을 사용 .sql
하여 OP와 마찬가지로 파일 을 작성 SOURCE
하고 맨 위에 간단한 명령 구문을 사용하여 파일을 작성하는 것입니다. 스크립팅 언어는 셸보다 문자열 조작에서 훨씬 우수하며 대부분 MySQL을 처리 할 때 필요한 인용 및 이스케이프 처리를위한 내장 프로 시저가 있습니다.