Я пытаюсь использовать Bash для построения запроса на моем postgres db. У меня есть массив asnums, и я хочу, чтобы запросить таблицу (dcan_nodup) в базе данных (ixmaps), чтобы подсчитать, сколько строк появляются те asnums в.Bash, массив, где условия, postgres select
Последующий фрагмент кода работает, ниже один Это не.
РАБОТЫ (производит разделенных запятой 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
NOPE # 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"
...
Что я хочу сделать, это использовать условия ИЛИ, чтобы объединить подсчеты из 2 или более из asns. Если бы я сделать это вручную, она работает просто отлично, например:
[email protected]:~/scripts$ psql -d ixmaps -Atc "select count(distinct traceroute_id) from dcan_nodup where asnum = 6461 or asnum = 17025;"
124
Но я не могу заставить его работать в цикле Баш ...
Я подозреваю, что я либо не избежать переменной правильно , а не конкатенировать строки правильно или что-то в равной степени тривиально - я новичок bash ...
$ Используется за пределами кавычек почти всегда является ошибкой в bash. – Jasen