将变量从Bash传递给psql

时间:2015-10-05 20:57:56

标签: bash

我在将变量从Bash传递到psql命令时遇到了一些麻烦。无法找出在需要的地方放置引号或者parantheses的位置

我基本上试图将今天的日期插入到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,这实际上是10减去5减2015 ...

2 个答案:

答案 0 :(得分:2)

您需要转义引号:

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

没有转义它们,它们被shell解释为字符串的结尾。然后插入日期(因为shell将前一个字符串与这个非引用字符串连接起来),最后,在日期之后,shell会看到另一个字符串用于SQL命令的其余部分并与其他字符串连接。 / p>

所以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>)

答案 1 :(得分:1)

要在引号中嵌入引号,您需要通过在它们前面加上反斜杠(\)来对它们进行转义。就像现在一样,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的扩展。