我在将变量从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 ...
答案 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
的扩展。