51

How to atore a scalar postgresql-value on a bash-variable like in script below?

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

I tried several different writings, but nothing seems to work. Thanks in advance.

Ansgar Wiechers
201k27 gold badges285 silver badges361 bronze badges
asked Mar 6, 2013 at 8:53
4
  • 1
    For command substitution you have to use either backticks (`) or $(). Single quotes (') won't do. Commented Mar 6, 2013 at 8:56
  • Thanks. But even vartest=$(psql -c -d testlauf -U postgres -h localhost -p 5432 "SELECT gid FROM testtable WHERE aid='1';") won't do the trick unfortunatelly... it gives me "sytnac error near or at "-d"" I also tried it with dbname... Commented Mar 6, 2013 at 9:03
  • ..somehow it swallows my backsticks in this coammands... but actually i added them before and after 2nd part of the assignment. Commented Mar 6, 2013 at 9:06
  • Possible duplicate of Store PostgreSQL query result to Shell or PostgreSQL variable Commented Jan 12, 2018 at 17:03

2 Answers 2

94

Put the -c option just before its argument - the query. Mind also using the additional -t option to get just the tuple value. And of course, use the backticks (`) operator.

Using the -X option is also recommended, as sometimes a .psqlrc file might add some redundant output, as well as the -A option, which disables column aligning (whitespaces).

In order to skip NOTICE or other additional messages, include the -q flag.

vartest=`psql -d $db -U $user -AXqtc "SELECT gid FROM testtable WHERE aid='1'"`
answered Mar 6, 2013 at 9:53
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks a lot Kouber, this does the trick! Actually backticks still don't seem to work for me, but ($) does: vartest=$(psql -X -h localhost -p 5432 -d testlauf -U postgres -c "SELECT gid FROM testtable WHERE aid='1';")
How to use dynamic bash script variable or psql variable in where condition
Thanks Kouber, is there any option to retain the new line ?
15

Using -t option or --tuples-only will give you the rows only, so it will easier to store them in array variable (if the result from query more than one)

vartest =(`psql -t -d $dbname -U $username -c "SELECT gid FROM testtable WHERE aid='1';"`)
echo $vartest

example:

query result

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

make it into array variable

 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
answered Jan 17, 2018 at 6:46

2 Comments

how to execute this command on a remote host? How to enter DB password?
There are several ways to execute on remote host, but for db password, by default postgresql is setup to use peer authentication on unix, just don't specify the -h localhost to use it-

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.