我有一个 sql 文件,我正在其中执行 cat 并分配给一个变量“SQL”。我在 sql 文件中有不同的数据库和不同的表。我试图使用 sed 替换文件中存储有值的表和数据库值,但每次运行它时我都会得到奇怪的结果。以下是我尝试过的方法:
sql文件查询:
SELECT *from DATABASE1.TABLE1
UNION ALL
SELECT *from DATABASE2.TABLE2
UNION ALL
SELECT *from DATABASE3.TABLE3
UNION ALL
SELECT *from DATABASE4.TABLE4
包含数据库和表详细信息的.sh 文件:
#!/bin/bash
DATABASE1="hr"
TABLE1="emp"
DATABASE2="account"
TABLE2="employee_details"
DATABASE3="payable"
TABLE3="job_details"
DATABASE4="dummy"
TABLE4="basic_details"
在使用上述值之前,我正在获取 .sh 文件,以便可以在 shell 上获取值的详细信息。
SQL=`cat query.sql`
query=$(echo $SQL| sed -e "s/DATABASE1/${DATABASE1}/;s/DATABASE2/${DATABASE2}/;
s/DATABASE3/${DATABASE3}/;s/DATABASE4/${DATABASE4}/;s/TABLE1/${TABLE1}/;
s/TABLE2/${TABLE2}/;s/TABLE3/${TABLE3}/;s/TABLE4/${TABLE4}/")
通过使用上面的方法,我得到了奇怪的结果,但是当我在 shell 上分配数据库和表变量并在上面的查询中使用时,我能够实现所需的结果。请让我知道在 .sh 文件方法中我做错了什么。
答案1
已经有一个工具可以做到这一点:envsubst
。它将$foo
用该变量的值替换字符串,很好地处理特殊字符。
无论如何,您都会遇到 SQL 语法错误:后面应该有一个空格*
。