2016-08-25 192 views
0

我正在写一个bash单线程。 此作品(打印日期到控制台或试图执行的话):Bash:转义变量

-bash-4.1$ DATE=`$(date --date="2 days ago" +%F)` echo "${DATE}" 

但这:

`DATE=$(date --date="2 days ago" +%F)` psql -d some_db -c "select row from table where started >= '${DATE}' and started < ('${DATE}'::date + '1 day'::interval);" 

给出:

ERROR: invalid input syntax for type timestamp: "" 
LINE 1: ... table where started >= '' ... 

这意味着${DATE}是空在那里。 我应该修改什么才能使其工作?

+1

w ^你是在混合'$(...)',然后在同一个命令中使用旧的back-ticks吗? – anubhava

+0

是的,但至少它知道名字,在第一个例子中显然不是空字符串。 – mnowotka

+1

你的第一行会产生'bash:2016-08-23:command not found'错误。它应该是:'DATE = $(date --date =“2 days ago”'+%F')&& echo“$ DATE”' – anubhava

回答

1

第一个命令由于几个原因而中断。首先,你正在混合反引号和$(),以这种方式执行date命令的输出,就好像它是另一个命令的名称一样。

将一个命令的输出保存到一个变量,使用此语法:

output=$(command) 

其次,变量将由外壳扩展,它已被分配一个值之前,所以你要分手了命令分为两个语句:

date=$(date_command); psql -c "select ... '$date'" 

...或者直接使用命令替换:

psql -c "select ... '$(date_command)" 
1

为什么在bash中计算日期? PG可以直接做:

SELECT ... WHERE started >= (datefield - interval '2 day') 
             ^^^^^^^^^^^^^^^^^ 
+0

谢谢你的回答。问题是如何在bash中做到这一点。请抽象出这是PG的事实,它可能是您需要使用日期的其他命令。 – mnowotka