Bash 将变量传递给psql脚本

Bash 将变量传递给psql脚本,bash,postgresql,variables,psql,Bash,Postgresql,Variables,Psql,我已经搜索了一段时间,但似乎找不到一个明确的答案。。。我试图从终端运行一个psql脚本,同时传递一个表变量名和另一个变量作为psql脚本的一部分 BASH命令: psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'"; PSQL脚本: SELECT count(*) FROM :table WHERE datekey = :v1; 以上工作。但是,我希望能够将tablename

我已经搜索了一段时间,但似乎找不到一个明确的答案。。。我试图从终端运行一个psql脚本,同时传递一个表变量名和另一个变量作为psql脚本的一部分

BASH命令:

psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'"; 
PSQL脚本:

SELECT count(*) FROM :table WHERE datekey = :v1;

以上工作。但是,我希望能够将tablename和附加变量转换为脚本本身中的字符串,以便在我定义的另一个函数中使用它。例如,我希望pg2的表名可以作为字符串“pg2”使用。datekey变量的类似要求。这可能吗?我的观察是,只有在CRUD操作或WHERE子句中使用时,才可能传递变量。

从您的问题中我得到的是对bash中的变量的误解。如果以下脚本有帮助,请尝试:

#!/bin/bash

user="user1"
sqlfile='/.../Desktop/.../sample.sql'
table='pg2'
v1="'2018-02-01'"

psql db1 -U "$user" -f "$sqlfile" -v table=$table -v v1="$v1"

除了堆栈/其他站点上的其他答案之外,有一种相当简单的方法可以在psql脚本本身中适应这一点。例如,原始BASH命令是:

psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'"; 
…在脚本中,需要为名为“copyFunction”的plpgsql函数输入两个字符串参数。这是通过将表名放在冒号后面的引号中并保持第二个变量不变而实现的。如果需要,第二个变量也可以在需要时加引号

SELECT copyfunction(:'table', :v1);

看:谢谢Ljm。我试图找到一种方法,在脚本中获取$table和$v1变量,并使它们在psql脚本本身中成为字符串。我这样做的原因是我在psql脚本中有另一个plpgsql函数,它要求将表名和变量作为字符串参数输入。有没有办法传递$table变量并在psql脚本中将其转换为字符串?太好了。对于需要将变量插入到“…”中的情况,这对我很有帮助,如以下简单情况:变量名称不起作用:创建表空间:表空间名称所有者:db_所有者位置:'TABLESPACE_folder';您能否进一步说明为什么需要在表中引用,而不是v1?