Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix 从文件读取的文本中未替换变量-Korn shell_Unix_Ksh - Fatal编程技术网

Unix 从文件读取的文本中未替换变量-Korn shell

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

这应该是一个简单的错误。但无法通过多次尝试解决

使用unix Korn shell,我想将sql文件读入unix ksh变量(文件正确缩进(格式化))。除此之外,我还想解析sql文本中的所有$variables

下面是按原样读取文件的命令。query.sql文件(实际文件更大,变量更多)有
$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