2017-02-22 9 views
0

私が持っているファイル内の変数を埋めるスクリプトimport.shインポートファイルと

. properties 
sql=$(cat sql.sql) 
${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    ${sql} 
    ${dbname} > ${log_file} 2>> ${log_file} 

properties

psql_path="/usr/pgsql-9.6/bin" 
dbname="postgres" 
path="/opt/files" 
log_file="ok.log" 

とiがpsqlコマンドを実行する必要がsql.sql

-c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 

ファイルファイルファイルからのインポート行スクリプトimport.shの行${sql}上ではなく、変数自体${path}、例えばテキスト/opt/files含む:

${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    -c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '/opt/files/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE2 FROM '/opt/files/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    ${dbname} > ${log_file} 2>> ${log_file} 

編集:今、取得すべてのイムは、以下の例です。変数${path}のテキストを挿入するにはどうすればよいですか?

${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    -c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE2 FROM '${path}/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    ${dbname} > ${log_file} 2>> ${log_file} 
+1

だから、これを解決しようとしているコードはどこですか?そのコードの問題は何ですか?あなたの試行、あなたが得たエラー、またはあなたが見ている予期せぬ動作の詳細な説明を含めるために質問を編集してください。完全な[MCVE](http://stackoverflow.com/help/mcve)を作成できない場合は、少なくとも解釈に役立つ結果をお伝えください。 – ghoti

+0

私は質問を編集しました。簡単に言えば、私はスクリプトに 'sql.sql'ファイルをインクルードする必要がありますが、それは可変テキストでそれを維持しています。 – Martin

答えて

1

このライン:

sql=$(cat sql.sql) 

は、この変数$ sqlをに "sql.sql" の内容を入れますが、その中の任意の変数を評価しません。これを行う正しい方法は、代わりにheredocを使用することです。しかし、私はあなたのスクリプトを維持したい把握するので、簡単な解決策は次のようになります。

sql=$(cat sql.sql | sed -e '[email protected]${path}@'"${path}"'@') 

これは、単純なランニングでのシェル変数の内容にの内容を置換する「$ {パス}」をセッド同じ名前。しかし、あなたの "sql"ファイルは明らかにSQLではないので、とにかくheredocの使用を検討してください。

アドバイスとして
1

は、ヒアドキュメントは最良の選択肢であると、単純なパラメータ置換を行うことができます。

. properties 

sql=$(cat sql.sql) 

${psql_path}/psql <<-EOF 
    -X 
    --set ON_ERROR_STOP=on 
    --set AUTOCOMMIT=on 
    --echo-all 
    ${sql//\$\{path\}/$path} 
    ${dbname} > ${log_file} 2>> ${log_file} 
EOF 

お知らせすぎライン拡張は、もはやどちらか必要であること。あなたもsql.sqlファイルからそれらを削除することができるはずです

関連する問題