2017-02-22 30 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" 

和文件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 '\"'" \ 

我需要运行psql命令从文件导入行在脚本import.sh${sql}但包括文字/opt/files,而不是变量本身${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 '/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}"'@') 

这是简单的运行sed将“$ {路径}”的内容代入的shell变量的内容同名。但无论如何,考虑使用heredocs,因为你的“sql”文件显然不是SQL。

1

诚如中,HEREDOC是最好的选择,然后简单的参数替换可以做到:

. 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文件中删除它们