Shell 重新计算表达式

Shell 重新计算表达式,shell,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 da

我想重新计算下面的表达式。 执行顺序如下:

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。它似乎不起作用


请提供任何建议。

首先分配文件,不要逃避文件扩展:

$ 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'

首先分配文件\u dt,不要逃避文件\u 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'
正如中所讨论的,代码应该存储在函数中——包含稍后要计算的命令替换或参数扩展的字符串就是代码。例如:

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
get_query() { echo "select count(*) from table1 where date='$(date -d "$1" +%Y-%m-%d)'"; }
get_query 20180616
当然,您可以使用
realized\u query=$(get\u query)
将基于当前
文件的字符串\u dt
分配给变量;如果更改
文件\u dt
,再次调用
get\u query
将根据更新的值生成新的查询


顺便说一下,如果你把它变成一个函数,考虑把日期从带中传递出去。例如:

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
get_query() { echo "select count(*) from table1 where date='$(date -d "$1" +%Y-%m-%d)'"; }
get_query 20180616
…因为
date-d
调用是函数的一部分,所以您可以不用太担心SQL注入:任何可能的输入都不会导致包含文本
的值,或者对数据库产生不希望的影响


也可以使用
eval
,尽管有风险。有关为什么最好避免使用基于
eval
的技术的讨论,请参阅;除了常见的安全问题外,这将导致
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\""
正如中所讨论的,代码应该存储在函数中——包含稍后要计算的命令替换或参数扩展的字符串就是代码。例如:

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
get_query() { echo "select count(*) from table1 where date='$(date -d "$1" +%Y-%m-%d)'"; }
get_query 20180616
当然,您可以使用
realized\u query=$(get\u query)
将基于当前
文件的字符串\u dt
分配给变量;如果更改
文件\u dt
,再次调用
get\u query
将根据更新的值生成新的查询


顺便说一下,如果你把它变成一个函数,考虑把日期从带中传递出去。例如:

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
get_query() { echo "select count(*) from table1 where date='$(date -d "$1" +%Y-%m-%d)'"; }
get_query 20180616
…因为
date-d
调用是函数的一部分,所以您可以不用太担心SQL注入:任何可能的输入都不会导致包含文本
的值,或者对数据库产生不希望的影响


也可以使用
eval
,尽管有风险。有关为什么最好避免使用基于
eval
的技术的讨论,请参阅;除了常见的安全问题外,这将导致
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\""

导出
似乎对OP正在做的任何事情都不需要——可能需要澄清的是,只有当OP需要子流程在其环境中查找变量时才应该使用它。OP正在做的任何事情似乎都不需要
导出
——可能需要澄清的是,应该只使用它如果他们需要子流程在其环境中查找变量。