Linux 将文件导入脚本并填充文件中的变量
我有脚本Linux 将文件导入脚本并填充文件中的变量,linux,bash,shell,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} 和文件属性 psql_path="/usr/pgsql-9.6/bin" dbname="postg
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}
和文件属性
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 '\"'" \
我需要在脚本import.sh
中的${sql}
行上运行psql
命令,从文件sql.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}
这一行:
sql=$(cat sql.sql)
将“sql.sql”的内容放入此变量$sql,但不会计算其中的任何变量。正确的方法是使用。但由于我发现您希望保留脚本,因此一个简单的解决方案是:
sql=$(cat sql.sql | sed -e 's@${path}@'"${path}"'@')
运行sed将“${path}”的内容替换为同名shell变量的内容非常简单。但是无论如何都要考虑使用遗传算法,因为你的“SQL”文件显然不是SQL。 这行:
sql=$(cat sql.sql)
将“sql.sql”的内容放入此变量$sql,但不会计算其中的任何变量。正确的方法是使用。但由于我发现您希望保留脚本,因此一个简单的解决方案是:
sql=$(cat sql.sql | sed -e 's@${path}@'"${path}"'@')
运行sed将“${path}”的内容替换为同名shell变量的内容非常简单。但是无论如何都要考虑使用遗传算法,因为你的“SQL”文件显然不是SQL。正如建议的那样,“遗传”是最好的选择,然后可以做简单的参数替换:
. 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=$(cat sql.sql)
${psql\u path}/psql>${log\u file}
EOF
请注意,也不再需要线扩展。您应该能够从sql.sql文件中删除它们正如建议的那样,herdoc是最好的选择,然后可以进行简单的参数替换:
. 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=$(cat sql.sql)
${psql\u path}/psql>${log\u file}
EOF
请注意,也不再需要线扩展。您还应该能够从sql.sql文件中删除它们。。。您试图解决此问题的代码在哪里?该代码有什么问题?请编辑您的问题,以包括您的尝试、您遇到的任何错误或您看到的意外行为的详细描述。如果你不能创建一个完整的,那么至少给我们你需要帮助解释的结果。简单地说,我需要在脚本中包含文件
sql.sql
,但要使用变量文本对其进行序列化。所以。。。您试图解决此问题的代码在哪里?该代码有什么问题?请编辑您的问题,以包括您的尝试、您遇到的任何错误或您看到的意外行为的详细描述。如果你不能创建一个完整的,那么至少给我们你需要帮助解释的结果。简单地说,我需要在脚本中包含文件sql.sql
,但要使用变量文本对其进行序列化。