如何`read` postgresql`select`输出到bash数组,一个匹配是一个元素?

How to `read` postgresql `select` output to bash array,one match is one element?

test表如下:

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');

使用 bash 脚本获取 postgresql select 的数组 res

#!/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

输出如下:

1
0   1|abc

预期输出为:

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

问题出在哪里?

由于read res <<< $res_temp,这是错误的。您希望从中得到什么?

我已经修复了您的脚本并举例说明了如何直接创建数组(我认为您正在尝试)。我没有 Postgresql 运行 atm,但 SQLite 也有。

我是如何创建数据的:

$ 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%';

您的解决方案

#! /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

直接一个数组

#! /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

哦,两者的输出:

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