将PostgreSQL的查询结果存储到Bash变量中

48
如何将 PostgreSQL 标量值存储到 bash 变量中,就像下面的脚本一样?
dbname="testlauf"
username="postgres"

vartest='psql -c -d $dbname -U $username -h localhost -p 5432 "SELECT gid FROM testtable WHERE aid='1';"'
echo "$vartest"

我尝试了几种不同的写作方式,但似乎都没有起作用。先行致谢。


1
对于命令替换,您必须使用反引号(\``)或 $()。单引号('`)不起作用。 - Ansgar Wiechers
谢谢。但是即使是vartest=$(psql -c -d testlauf -U postgres -h localhost -p 5432 "SELECT gid FROM testtable WHERE aid='1';"),不幸的是它也行不通... 它给了我“在-d附近或者语法错误” 我也尝试过使用dbname... - knutella
不知怎么的,这些命令吞掉了我的后引号...但实际上我在赋值的第二部分之前和之后都添加了它们。 - knutella
可能是将PostgreSQL查询结果存储到Shell或PostgreSQL变量中的重复问题。 - Francisco Puga
2个回答

89
请将查询的参数放在选项-c之前,并注意使用附加选项-t仅获取元组值。当然,要使用反引号(`)操作符。建议还使用-X选项,因为有时.psqlrc文件可能会添加一些冗余输出,同时使用-A选项禁用列对齐(空格)。为了跳过NOTICE或其他附加消息,请包括-q标志。
vartest=`psql -d $db -U $user -AXqtc "SELECT gid FROM testtable WHERE aid='1'"`

3
非常感谢你,Kouber,这很好用!实际上,反引号对我仍然不起作用,但美元符号可以:vartest=$(psql -X -h localhost -p 5432 -d testlauf -U postgres -c "SELECT gid FROM testtable WHERE aid='1';")。 - knutella
如何在where条件中使用动态bash脚本变量或psql变量 - Sherin Green
谢谢Kouber,有没有保留换行的选项? - undefined

15
使用-t选项或--tuples-only选项将仅返回行,因此如果查询结果超过一个,则更容易将它们存储在数组变量中。请注意保留HTML标签。
vartest =(`psql -t -d $dbname -U $username -c "SELECT gid FROM testtable WHERE aid='1';"`)
echo $vartest

例子:

查询结果

ubuntu@ratnakri:~$ psql -h localhost -p 5432 -t -U postgres -d postgres -c "select slot_name from pg_replication_slots"
barman
barman2

将其转换为数组变量
    ubuntu@ratnakri:~$ RESULT=(`psql -h localhost -p 5432 -t -U postgres -d postgres -c "select slot_name from pg_replication_slots"`)
    ubuntu@ratnakri:~$ echo ${RESULT[0]}
    barman
    ubuntu@ratnakri:~$ echo ${RESULT[1]}
    barman2

1
如何在远程主机上执行此命令?如何输入数据库密码? - Andrey
有几种在远程主机上执行的方法,但是对于数据库密码,默认情况下PostgreSQL设置为在Unix上使用对等身份验证,只需不指定-h localhost即可使用它。 - chrismarx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接