Return SQL 查询为 bash 数组
Return SQL Query as bash array
首先Post。 Bash新手。找不到有效的解决方案。
寻找高效的解析方法/替代方法
我的初步尝试:(+感谢@larks 的编辑)
services=($($PSQL "SELECT array(select name from services);"))
echo ${services[@]}
>array -------------------------------- {Shampoo,Dying,Long-cut} (1 row)
echo ${#services[@]}
>5
echo ${services[2]}
>{Shampoo,Dying,Long-cut}
我希望最终得到一个与下面相同的数组,但没有在此过程中创建 csv。
echo $($PSQL "\copy (select name from services) to 'services.csv';")
readarray arr -t a < services.csv
echo ${arr[@]}
>Shampoo Dying Long-cut
echo ${#services[@]}
>3
您的 services
变量不是数组;要创建一个数组,您需要用 (...)
将值括起来。例如,比较一下:
$ example=$(echo one two three)
$ echo ${example[0]}
one two three
有了这个:
$ example=( $(echo one two three) )
$ echo ${example[0]}
one
因此假设您的 $PSQL
命令以适当的格式生成输出,您需要:
services=( $($PSQL "SELECT array(select name from services);") )
对于您在问题中尝试做的事情,我看不出有任何理由使用 array
函数。给出这样的 table:
CREATE TABLE services (
id serial primary key,
name text
);
INSERT INTO services (name) VALUES ('foo');
INSERT INTO services (name) VALUES ('bar');
INSERT INTO services (name) VALUES ('qux');
像这样的查询将生成可修改的结果,以便转换为 bash 数组:
$ psql -t --csv -U postgres -d arraytest -c 'select name from services'
foo
bar
qux
在 bash 脚本中:
services=( $(psql -t --csv -U postgres -d arraytest -c 'select name from services') )
for service in "${services[@]}"; do
echo "SERVICE: $service"
done
产生:
SERVICE: foo
SERVICE: bar
SERVICE: qux
首先Post。 Bash新手。找不到有效的解决方案。
寻找高效的解析方法/替代方法
我的初步尝试:(+感谢@larks 的编辑)
services=($($PSQL "SELECT array(select name from services);"))
echo ${services[@]}
>array -------------------------------- {Shampoo,Dying,Long-cut} (1 row)
echo ${#services[@]}
>5
echo ${services[2]}
>{Shampoo,Dying,Long-cut}
我希望最终得到一个与下面相同的数组,但没有在此过程中创建 csv。
echo $($PSQL "\copy (select name from services) to 'services.csv';")
readarray arr -t a < services.csv
echo ${arr[@]}
>Shampoo Dying Long-cut
echo ${#services[@]}
>3
您的 services
变量不是数组;要创建一个数组,您需要用 (...)
将值括起来。例如,比较一下:
$ example=$(echo one two three)
$ echo ${example[0]}
one two three
有了这个:
$ example=( $(echo one two three) )
$ echo ${example[0]}
one
因此假设您的 $PSQL
命令以适当的格式生成输出,您需要:
services=( $($PSQL "SELECT array(select name from services);") )
对于您在问题中尝试做的事情,我看不出有任何理由使用 array
函数。给出这样的 table:
CREATE TABLE services (
id serial primary key,
name text
);
INSERT INTO services (name) VALUES ('foo');
INSERT INTO services (name) VALUES ('bar');
INSERT INTO services (name) VALUES ('qux');
像这样的查询将生成可修改的结果,以便转换为 bash 数组:
$ psql -t --csv -U postgres -d arraytest -c 'select name from services'
foo
bar
qux
在 bash 脚本中:
services=( $(psql -t --csv -U postgres -d arraytest -c 'select name from services') )
for service in "${services[@]}"; do
echo "SERVICE: $service"
done
产生:
SERVICE: foo
SERVICE: bar
SERVICE: qux