通过 Bash psql 从 postgresql 数据库使用 `select ...pgp_sym_decrypt ()` 时合并的列

Columns combined when using `select ...pgp_sym_decrypt ()` from postgresql databse through Bash psql

系统是 Debian 11.2 和 PostgreSQL 11.5。

我创建了一个数据库,table如下:

CREATE DATABASE dbname OWNER=postgres
ENCODING= 'UTF8'

\c dbname

CREATE TABLE test(
   id serial primary key,
   site varchar(100)    NOT NULL,
   username char(30) NOT NULL,
   password        char(300)    NOT NULL,
   note            varchar(200) DEFAULT NULL
);

创建 bash 文件如下:

#!/bin/bash
res_user='me'
db_user='postgres'
db_name='dbname'
table_name='test'
sym_key='key'

#insert 4 columns
    su $db_user <<EOFU
psql -d "$db_name" -U "$db_user" << EOF
INSERT INTO $table_name (site,username,password,note) VALUES ('v4','u3',pgp_sym_encrypt('password','key','cipher-algo=aes128,compress-algo=0,convert-crlf=1,sess-key=0,s2k-mode=3'),'note3');
EOF
EOFU

#column note has no output
   password_arr=($(su $db_user <<EOFU
psql -tAq --field-separator= -d "$db_name" -U "$db_user" << EOF
SELECT "username",pgp_sym_decrypt(password::bytea,'key'),"note" FROM "$table_name" WHERE "site" LIKE '%v4%';
EOF
EOFU
))
echo "${password_arr[1]}" #output is passwordnote3
echo "${password_arr[2]}" #no ouput?

预期输出是:

${password_arr[1]} is `password`
${password_arr[2]} is `note3`

运行上面的bash脚本,但是输出"${password_arr[2]}"没有值,"${password_arr[1]}"passwordnote3。问题出在哪里?

我发现了问题。问题是您将 --field-separator 指定为“无”而不是 space。应该是--field-separator=" "。这允许 pgp_sym_decrypt() 的输出与 note 连接。然而,用户名字段总是有 spaces,可能是因为它的固定宽度为 30。

我还建议您将行输出数减少到 1,并在依赖分词时启用“noglob”选项。这可以用 set -f 来完成。您还可以使用 read 来获取所需的字段。参见 How to split a string into an array in Bash?