Bash脚本&;PostgreSQL:如何访问SELECT语句返回的列值

Bash脚本&;PostgreSQL:如何访问SELECT语句返回的列值,sql,bash,postgresql,Sql,Bash,Postgresql,我在PostgreSQL中有一个名为customers的数据库,customers有一个名为CustomerInfo的表。CustomerInfo包含3列ID、名称和地址。我想编写一个bash脚本来从CustomerInfo表中获取信息,但我不确定在得到查询结果后如何访问各个行。以下是我写的脚本: #!/bin/bash results=`psql -d customers -c "select * from CustomerInfo where name = 'Dave'"` echo

我在PostgreSQL中有一个名为customers的数据库,customers有一个名为CustomerInfo的表。CustomerInfo包含3列ID、名称和地址。我想编写一个bash脚本来从CustomerInfo表中获取信息,但我不确定在得到查询结果后如何访问各个行。以下是我写的脚本:

#!/bin/bash  

results=`psql -d customers -c "select * from CustomerInfo where name = 'Dave'"`

echo $results['name']
查询正确运行并返回正确的结果,但echo命令只会打印结果中的所有内容。我知道这不是正确的方法,是否有人知道一种将查询结果作为数组获取的方法,或者我只需要编写自己的函数来解析结果


谢谢

你不能。您必须编写自己的函数来对查询结果进行排序。Backtick(`)将执行命令并返回输出。
在您的情况下,结果将有查询的输出。

如果我被指派这样做(实际上,Perl更好,请接受@daniel verite的建议),我会这样做

  • 通过管道将初始结果传递到
    head
  • 创建一个函数,使用awk将其余部分解析为有用的格式
  • sed或awk从行中提取相关信息
  • 现在,上面假设没有内嵌的换行符(这会使事情复杂化)


    这样的努力绝不是微不足道的。对于这样的任务,您最好学习Perl。

    您可以将结果存储到数组中,并使用while循环进行循环

    psql -d customers -c "select * from CustomerInfo where name = 'Dave'"
    | while read -a Record ; do
        # ${Record[0]} is your ID field
        # ${Record[1]} is your Name field
        # ${Record[2]} is your address field
    done
    

    我成功地使用了

    psql | while read do 
    
    方法:

    $PG_HOME/bin/psql \
    -h 127.0.0.1 \
    -U $DB_USER \
    -c 'SELECT recipient_email, name FROM report_recipients' \
    --set ON_ERROR_STOP=on \
    --no-align \
    --quiet \
    --no-password \
    --tuples-only \
    --field-separator ' ' \
    --pset footer=off \
    --dbname=$DATABASE \
    | while read EMAIL_ADDRESS NAME   ; do
        echo "$SCRIPT: addr=$EMAIL_ADDRESS  name=$NAME"
    done
    

    关于这一点和类似的事情,有一个很好的资源:

    用bash做这类事情最好花在学习Perl基础知识上。在尝试自己编写任何东西之前,你必须了解你在这里做的事情:执行一个命令并将其输出(文本)存储在一个变量中。因此,您需要解析和反汇编该文本以使其正常工作。在尝试将psql输出传输到while时,上述方法出现了一个奇怪的错误:第18行:第31行的语法错误:“|”对于相关行的引用来说是意外的:“``$psql \-X \-h$host \-U$username \-c”$id\U sql”\--单个事务\--设置自动提交=关闭\--设置打开\--错误\-停止=打开\--不对齐\--字段分隔符“”--数据库名$dbname \--安静\;读取id时\u num name;如果只想迭代值(而不是描述列的标题),请在psql命令中添加-t。