Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件导入脚本并填充文件中的变量_Linux_Bash_Shell - Fatal编程技术网

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
,但要使用变量文本对其进行序列化。