Unix 从文件读取的文本中未替换变量-Korn shell
这应该是一个简单的错误。但无法通过多次尝试解决 使用unix Korn shell,我想将sql文件读入unix ksh变量(文件正确缩进(格式化))。除此之外,我还想解析sql文本中的所有$variables 下面是按原样读取文件的命令。query.sql文件(实际文件更大,变量更多)有Unix 从文件读取的文本中未替换变量-Korn shell,unix,ksh,Unix,Ksh,这应该是一个简单的错误。但无法通过多次尝试解决 使用unix Korn shell,我想将sql文件读入unix ksh变量(文件正确缩进(格式化))。除此之外,我还想解析sql文本中的所有$variables 下面是按原样读取文件的命令。query.sql文件(实际文件更大,变量更多)有$MONTH和$YEAR,我希望在qry中替换实际值 IFS用于避免删除换行符。下面是一个可测试的ksh代码 #!/usr/bin/ksh createqry() { MO
$MONTH
和$YEAR
,我希望在qry中替换实际值
IFS
用于避免删除换行符。下面是一个可测试的ksh代码
#!/usr/bin/ksh
createqry()
{
MONTH=$1
YEAR=$2
IFS=
qry=$(cat query.sql)
echo $qry
}
QRY=$(createqry $month,$year)
#write the QRY to file
echo "$QRY" > outputqry.sql
例如:query.sql
Select * from table where trans_month=$MONTH and trans_Year=$YEAR
outputqry.sql
应该是
Select * from table where trans_month=10 and trans_Year=2017
对于downvote,我在谷歌上搜索过,所以也遇到了同样的问题,无法解决。因此,post看起来您想要的是对
$MONTH
和$YEAR
引用进行评估,虽然这是可行的,但随后您会遇到一个问题,即*
也将被评估(例如,*
替换为当前目录中每个文件的名称)
其他人可以提供一个解决方案,说明是否/如何计算变量,但不包括星号。。。虽然我将提出一种不同的方法。。。当我想将变量传递到template*sql脚本中时,我通常会这样做
第一步是重新格式化模板脚本,使用名称作为占位符,这也作为db引擎的无效标识符(例如,除非占位符已被正确替换,否则将阻止模板脚本在数据库中运行)。比如:
$ cat query.sql
Select * from table where trans_month=MONTH and trans_Year=YEAR
假设我们有当前的变量赋值
$ YEAR=10 MONTH=2018
现在,根据shell(和版本)以及您对命令的偏好,您有几个选项可以替换月份
和年份
占位符。举几个例子:
# disable expansion of '*'
$ set -f
# let 'sed' replace place holders with variable values;
# make sure you use double quotes around the 'sed' patterns
# to ensure the variables are evaluated
$ x=$(sed "s/MONTH/${MONTH}/g ; s/YEAR/${YEAR}/g" query.sql)
# let's see what we got
$ echo "${x}"
Select * from table where trans_month=10 and trans_Year=2014
使用bash
,如果愿意,可以使用流程替换:
$ set -f
$ read x < <(sed "s/MONTH/${MONTH}/g ; s/YEAR/${YEAR}/g" query.sql)
$ echo "${x}"
Select * from table where trans_month=10 and trans_Year=2014
$set-f
$read x<如果query.sql
中的所有变量都用大括号括起来,比如${month}
,那就容易多了。在匹配模式中包含大括号时,不必担心$year
和$year
。我添加了sort-r
,试图绕过变量。
我需要一个变量中未知的字符来构造sed命令。我使用了=
并省略了有一个变量的变量(结果是env
输出中有两个=
。
您已将问题标记为ksh
,因此以下(使用流程替换)将不起作用:
sed -f <(env | grep -Ev "=.*="| sort -r | sed -r 's/(.*)=(.*)/s=$\1=\2=g/') query.sql
IFS
的正确使用非常棘手。有时候,我知道这是唯一的办法,但它的出人意料率很高。让它尽可能靠近您需要的代码行,然后尽可能快地将其恢复为默认值。在任何情况下,请发布一个最小的、完整的、可验证的失败示例-它应该包括您的IFS
行。在GNU包gettext中,您可以找到envsubst
。根据您的ksh
标签,以下答案不合适:qry=$(envsubt@mikeandrews:modified了代码,它可以作为is@MikeAndrews without if在输出sqlThank中删除了所有换行符。这个find replace方法对我来说也不错。我将测试换行符是否也会保持不变。还有一个想法-如果我在query.sql中使用$star作为占位符并在代码中替换它会怎么样作为$star=“*”。它有效吗?因为在我的实际查询中,我有两个以上的变量。所以使用sed,它会变得很长
env | grep -Ev "=.*="| sort -r | sed -r 's/(.*)=(.*)/s=$\1=\2=g/' > /tmp/srd.wrk
sed -f /tmp/srd.wrk query.sql