Arrays Bash,where条件数组,postgreselect

Arrays Bash,where条件数组,postgreselect,arrays,bash,postgresql,Arrays,Bash,Postgresql,我试图使用Bash在我的postgres数据库上构造一个查询。 我有一个asnum数组,我想查询数据库ixmap中的表dcan_nodup,以计算这些asnum出现在其中的行数 下面的代码段有效,下面的代码段无效 WORKS生成一个逗号分隔的csv,其预期值为: declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489) echo "" echo "Generating CrFreqTR..." for a

我试图使用Bash在我的postgres数据库上构造一个查询。 我有一个asnum数组,我想查询数据库ixmap中的表dcan_nodup,以计算这些asnum出现在其中的行数

下面的代码段有效,下面的代码段无效

WORKS生成一个逗号分隔的csv,其预期值为:

declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489)
echo ""
echo "Generating CrFreqTR..."
for asnum in "${carriers[@]}"
do
    echo $asnum
    count=$(psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where asnum = '$asnum';")
    echo $count
    echo $asnum", "$count >> dcan_crfreq_tr.csv
done
不起作用:

declare -a whereConditions=('asnum = 6461 or asnum = 17025' 'asnum = 33139' 'asnum = 17899' 'asnum = 7018 or asnum = 5730 or asnum = 4466' 'asnum = 577 or asnum = 6549 or asnum = 11489')
for w in "${whereConditions[@]}"
do
    echo $w

    echo psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where "$w";"
    psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where "$w";"
    echo "NOPE #1"

    count=$(psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where '$w';")
    echo $count
    echo "NOPE #2"
    echo $w", "$count >> dcan_crfreq_tr.csv
done
否1结果:

asnum = 6461 or asnum = 17025
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 6461 or asnum = 17025;
psql: warning: extra command-line argument "6461" ignored
psql: warning: extra command-line argument "or" ignored
psql: warning: extra command-line argument "asnum" ignored
psql: warning: extra command-line argument "=" ignored
psql: warning: extra command-line argument "17025;" ignored
psql: FATAL:  Ident authentication failed for user "="
NOPE #1
asnum = 33139
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 33139;
psql: warning: extra command-line argument "33139;" ignored
psql: FATAL:  Ident authentication failed for user "="
NOPE #1
asnum = 17899
psql -d ixmaps -Atc select count(distinct traceroute_id) from dcan_nodup where asnum = 17899;
psql: warning: extra command-line argument "17899;" ignored
psql: FATAL:  Ident authentication failed for user "="
...
NOPE 2结果:

asnum = 6461 or asnum = 17025
ERROR:  invalid input syntax for type boolean: "asnum = 6461 or asnum = 17025"
NOPE #2
asnum = 33139
ERROR:  invalid input syntax for type boolean: "asnum = 33139"
...
我要做的是使用OR条件组合2个或更多ASN的计数。如果我手动执行此操作,则效果很好,例如:

ixmaps@trgen:~/scripts$ psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where asnum = 6461 or asnum = 17025;"
124
但我不能让它在bash循环中工作


我怀疑我要么没有正确地转义变量,要么没有正确地连接字符串,要么是同样琐碎的事情——我是一个bash新手……

您的问题很可能是在扩展$w时,您丢失了双引号

假设w='1'2'

比较printf%s\\n foo$w条的输出:

要打印%s\\n foo$wbar:

所以你不想

psql ... "select ... "$w"...;"
相反,你想要

psql ... "select ... $w ...;"
像这样

declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489)

function join { local IFS="$1"; shift; echo "$*"; } 

echo ""
echo "Generating CrFreqTR..."

q= "copy ( select asnum count(distinct traceroute_id) from dcan_nodup where asnum in (" \
    `join , "${carriers[@]"` ") group by asnum ) TO STDOUT WITH CSV";

 psql -d ixmaps -Atc "$q" >> dcan_crfreq_tr.csv

在bash中,在引号之外使用$几乎总是一个错误。唉,是的。我想我试过这个变种。所以我猜bash在这方面与我所知道的其他语言有所不同…@colinsnotin是的,大多数编程语言都不会处理分词。在很多foo$varbar中这样说是不合法的。Jasen,我似乎无法让它工作——也无法真正解决它,因为我也完全无法解析它。Bash声称正在寻找一个结束报价,但他们看起来都是匹配的。错误是:在查找匹配的“%1”时出现意外的EOF。这是一个耻辱,因为它看起来比我写的废话更有效率
psql ... "select ... $w ...;"
declare -a carriers=(6461 17025 33139 17899 7018 5730 4466 577 6549 11489)

function join { local IFS="$1"; shift; echo "$*"; } 

echo ""
echo "Generating CrFreqTR..."

q= "copy ( select asnum count(distinct traceroute_id) from dcan_nodup where asnum in (" \
    `join , "${carriers[@]"` ") group by asnum ) TO STDOUT WITH CSV";

 psql -d ixmaps -Atc "$q" >> dcan_crfreq_tr.csv