1

test tables as below:

create table test(col1 int, col2 varchar,col3 date);
insert into test values (1,'abc','2015-09-10');
insert into test values (1,'abd2','2015-09-11');
insert into test values (21,'xaz','2015-09-12');
insert into test values (2,'xyz','2015-09-13');
insert into test values (3,'tcs','2015-01-15');
insert into test values (3,'tcs','2016-01-18');

Use bash script to get array res of postgresql select.

#!/bin/bash
res_temp=$(psql -tAq postgresql://"$db_user":"$db_password"@localhost:"$db_port"/"$db_name" << EOF
SELECT "col1","col2" FROM "test" WHERE "col2" LIKE '%a%';
EOF
)

read  res <<< $res_temp
#should be 3,but output 1
echo ${#res[@]}
for i in "${!res[@]}"; do
  printf "%s\t%s\n" "$i" "${res[$i]}"
done

Output as below:

1
0   1|abc

Expect output is:

3
0   1|abc
1   1|abd2
2   21|xaz

Where is the problem?

1 Answer 1

1

This is going wrong because of the read res <<< $res_temp. What do you expect to retrieve from that?

I've fixed your script and put an example how to directly create an array (which I think you're trying). I don't have Postgresql running atm, but SQLite does the same.

How I created the data:

$ sqlite ./a.test
sqlite> create table test(col1 int, col2 varchar(100),col3 varchar(100));
sqlite>  insert into test values (1,'abc','2015-09-10');
sqlite>  insert into test values (1,'abd2','2015-09-11');
sqlite>  insert into test values (21,'xaz','2015-09-12');
sqlite>  insert into test values (2,'xyz','2015-09-13');
sqlite>  insert into test values (3,'tcs','2015-01-15');
sqlite>  insert into test values (3,'tcs','2016-01-18');
sqlite> SELECT col1,col2 FROM test WHERE col2 LIKE '%a%';

Your solution

#! /bin/bash
res_tmp=$(sqlite ./a.test "SELECT col1,col2 FROM test WHERE col2 LIKE '%a%';")
read -a res <<< ${res_tmp[@]}

echo ${#res[@]}
for i in "${!res[@]}"; do
  printf "%s\t%s\n" "$i" "${res[$i]}"
done

exit 0

Directly an array

#! /bin/bash
res=($(sqlite ./a.test "SELECT col1,col2 FROM test WHERE col2 LIKE '%a%';"))

echo ${#res[@]}
for i in "${!res[@]}"; do
        printf "%s\t%s\n" "$i" "${res[$i]}"
done

exit 0

Oh, and output of both:

3
0       1|abc
1       1|abd2
2       21|xaz
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

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.