2016-12-05 3 views
0

mysqldumpツールを使用してデータベースのバックアップを取る必要があります。 私のテストテーブルには、フィルタとして使用する必要があるTIMESTAMPカラムがあります。 私は次のコードでbashスクリプトを使用しています:私は動作するはずと仮定し、コマンドを印刷していbashでmysqldumpの引用符をエスケープするには?

#!/bin/bash 
cmd="mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where=\"timestamp_c>='2016-12-03 00:00:00'\" --tables \"test_table\"" 
echo $cmd 
$cmd 

。上記のスクリプトは、出力を生成します:

mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where="timestamp_c>='2016-12-03 00:00:00'" --tables "test_table" 

端末で印刷されたコマンドをコピーすると、 しかし、スクリプトのコマンドはエラーを出力します。

mysqldump: Couldn't find table: "00:00:00'"" 

は私が脱出引用符については理解していないよ何かはありますか?

+0

変数を挿入していない場合は、二重引用符で囲まれた文字列を使用しても効果はありません。 –

答えて

2

変数はコードではなくデータを保持します。代わりに関数を定義してください。

cmd() { 
    mysqldump --verbose --opt --extended-insert \ 
      --result-file /home/backups/mysql/test/test_table.20161205.bak test \ 
      --where="timestamp_c>='2016-12-03 00:00:00'" \ 
      --tables "test_table" 
} 
+0

このアプローチはうまく動作し、 'eval'によって許可された汚れたコードを避けています。 – Takumi

-1

「eval」を使用してコマンドを実行してみてください。例:

#!/bin/bash 
cmd="mysqldump --verbose --opt --extended-insert --result-file /home/backups/mysql/test/test_table.20161205.bak test --where=\"timestamp_c>='2016-12-03 00:00:00'\" --tables \"test_table\"" 
eval $cmd 
+0

'eval'は文字列の値を評価して実行しませんか?私はdownvoteの理由を見ることができません。説明をお願いします。 – yogur

+0

変数にはコードが含まれていません。代わりに関数を使うことができます。 – andlrc

+0

@andlrcそれは本当ですが、私は単に匠の具体的な質問について答えを出しただけです。 – yogur

関連する問題