2015-10-05 89 views
3

我在将一个变量从Bash传递给psql命令时遇到了一些麻烦。想不出哪里需要将变量从Bash传递到psql

我基本上是试图插入今天的日期为日期列上一个Postgres表

today=$(date +"%m-%d-%Y") 

echo $today 
#10-05-2015 

psql -h hostname -U admin -d db-p 5439 -c \ 
"INSERT INTO public.log_table (day, rowcount) VALUES ("$today", $rowcount)"; 

我已经打过电话$today不带引号在何处放置引号或括号和其他一些变化,但不能让它通过我想要的,这是10-05-2015。相反,该值-2010被插入,这是essentialy 10减去5减去2015年......

回答

3

你需要躲避报价:

"INSERT INTO public.log_table (day, rowcount) VALUES (\"$today\", $rowcount)"; 

没有逃脱他们,他们正在以Shell解释字符串的结尾。然后插入日期(因为shell将前一个字符串与此非引号字符串连接起来),最后,在该日期之后,shell会为SQL命令的其余部分看到另一个字符串,并与其他字符串连接。

那么PSQL被接收为

INSERT INTO public.log_table (day, rowcount) VALUES (10-05-2015, <rowcount_value>) 

,并认为它是整数,所以psql的解决要插入整数-2010

正确引用它之后,PSQL接收:

INSERT INTO public.log_table (day, rowcount) VALUES ("10-05-2015", <rowcount_value>) 
+0

我有另一个逃避相关的问题。查询有点不同,看起来像'“BEGIN READ WRITE; COPY public.tablename FROM's3://location/filename.txt'”'我想创建一个像'locationname = directoryname'这样的变量并在最后一部分。所以这个查询看起来像是''BEGIN READ WRITE; COPY public.tablename FROM's3://$locationname/filename.txt'“'这次我怎样才能避免引用? – simplycoding

+0

@simplycoding这次不需要转义引号 –

2

要嵌入引号内的引号,你需要用反斜杠(\)之前他们逃离他们。就像现在这样,bash将$today左边的引号解释为终止一个带引号的字符串,并立即将右引号标识为开始一个新字符串。

这似乎是你想要做什么:

psql -h hostname -U admin -d db-p 5439 -c \ 
"INSERT INTO public.log_table (day, rowcount) VALUES (\"$today\", $rowcount)"; 

或者,你可以使用单引号的命令中,而不是,这将是更标准的SQL:

psql -h hostname -U admin -d db-p 5439 -c \ 
"INSERT INTO public.log_table (day, rowcount) VALUES ('$today', $rowcount)"; 

你不能但是,使用撇号引用整个命令,因为这会抑制$today的扩展。