将文件导入脚本并填充文件中的变量

时间:2017-02-22 13:00:12

标签: linux bash shell

我有脚本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命令,导入脚本sql.sql${sql}行上的文件import.sh中的行,但包含文本/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}

2 个答案:

答案 0 :(得分:1)

这一行:

sql=$(cat sql.sql)

将“sql.sql”的内容放入此变量 $ sql 中,但不会评估其中的任何变量。这样做的正确方法是使用heredoc。但是,既然我发现你想保留你的脚本,一个简单的解决方案就是:

sql=$(cat sql.sql | sed -e 's@${path}@'"${path}"'@')

这是一个简单的运行sed,用于将“$ {path}”的内容替换为同名shell变量的内容。但无论如何要考虑使用heredocs,因为你的“sql”文件显然不是SQL。

答案 1 :(得分: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文件中删除它们