生成された.sql
ファイルをインポートするプロセスを「自動化」し、ファイルをstdin
やに通過させようとする際に隠れるすべてのトラップを回避stdout
するには、MySQL .sql
のSOURCE
コマンドを使用して生成されたファイルを実行するようにMySQLに指示します。
Kshitij Soodからの短いが優れた回答の構文は、最良の開始点を提供します。つまり、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を使用するメリットはほとんどなくなります。
もう1つのオプションは、Bashで許可されている複数行の引用符付き文字列を、バッチ構文バージョン(と-Bse
)で使用することです。私は他のシェルを知らないので、それらがそこでも動作するかどうかはわかりません。とにかくコマンドで複数の.sql
ファイルを実行するには、これを使用する必要があります。これは、他のMySQLコマンドのようにで終了されず、1行に1つしか許可されないためです。複数行の文字列は一重引用符または二重引用符で囲むことができ、シェルの展開に対する通常の影響があります。また、バッククォートなどにHEREDOC構文を使用する場合と同じ注意事項があります。SOURCE
;
潜在的に優れたソリューションは.sql
、OPと同じように、スクリプト言語、Perl、Pythonなどを使用してファイルを作成し、SOURCE
そのファイルを上部の単純なコマンド構文を使用して作成することです。スクリプト言語は、シェルよりも文字列操作がはるかに優れており、ほとんどの場合、MySQLを処理するときに必要な引用とエスケープを処理する組み込みのプロシージャがあります。