重新评估表达式

时间:2018-06-17 20:27:55

标签: shell

我想重新评估以下表达式。 执行顺序如下:

export query1="select count(*) from table1 where date='\${file_dt}'"

file_date="20180616"
file_dt=`date -d ${file_date} +'%Y-%m-%d'`
echo $file_dt

>>2018-06-16

echo "$query1"
>>select count(*) from table1 where date='${file_dt}'

我希望结果是

>>select count(*) from table1 where date='2018-06-16'

我尝试了eval echo eval和eval echo。它似乎不起作用。

请提出任何建议。

2 个答案:

答案 0 :(得分:2)

BashFAQ #50中所述,代码应存储在函数中 - 包含命令替换的字符串或稍后要评估的参数扩展是代码。例如:

get_query() { echo "select count(*) from table1 where date='${file_dt}'"; }

file_date=20180616
file_dt=$(date -d "$file_date" +%Y-%m-%d)

get_query

当然,您可以使用realized_query=$(get_query)将基于当前file_dt的字符串分配给变量;如果您更改file_dt,则再次调用get_query将根据更新后的值生成新查询。

顺便说一下 - 如果你把它变成一个函数,考虑在带外传递日期。例如:

get_query() { echo "select count(*) from table1 where date='$(date -d "$1" +%Y-%m-%d)'"; }
get_query 20180616

...因为date -d调用是函数的一部分,所以对SQL注入的关注较少:没有可能的输入会导致包含文字'的值或者有不良影响可以使用数据库。

也可以使用eval,虽然有风险。有关为何最佳避免基于eval的技术的讨论,请参阅BashFAQ #48;除了通常的安全问题之外,这会导致字符串eval中的任何文字双引号被更改为语法单引号,关闭作为eval字符串的一部分硬编码的语法双引号,否则会导致一团糟。

然而,为了完整起见:

# DO NOT DO THIS. Error-prone.

query1="select count(*) from table1 where date='\${file_dt}'"

file_date="20180616"
file_dt=`date -d ${file_date} +'%Y-%m-%d'`

eval "echo \"$query1\""

答案 1 :(得分:0)

首先分配file_dt,不要转义file_dt扩展名:

$ file_date="20180616"
$ file_dt=`date -d ${file_date} +'%Y-%m-%d'`
$ export query1="select count(*) from table1 where date='${file_dt}'"
$ echo "$query1"
select count(*) from table1 where date='2018-06-17'