Если я понимаю, что формат результата вашего запроса равен "phonenum userattr"
в каждой строке, то вы можете создать ассоциативный массив с ключом userattr
(например, result[$userattr]=phonenum
). Чтобы разделить значения в ассоциативный массив, вы можете использовать подстановка процесса (вместо подстановка команды ), чтобы предоставить входные данные для while
l oop, который вы используете для создания ассоциативный массив, например
#!/bin/bash
#Ref = https://www.linuxquestions.org/questions/programming-9/bash-to-loop-thorouh-mysql-select-array-882907/#post5798608#
#
DBUSER="user"
DBNAME="pass"
declare -A result
while read -r phone userattr; do
result[$userattr]=$phone
done < <(mysql --user ${DBUSER} ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';")
for attrib in "${!result[@]}"; do
printf "%-8s : %s\n" "$attrib" "${result[$attrib]}"
done
( примечание: ваш cnt=${#result[@]}
также будет работать нормально выше)
У меня нет базы данных для тестирования, но с указанными выше значениями, равными "phonenum userattr"
на строку ввода, вывод будет:
545454 : 5223121219
2005 : 3223121219
667 : 1223121219
( примечание: помните, что для ассоциативных массивов вы сохраняете порядок данных является вводом, это ассоциативный массив, порядок добавления элементов не имеет значения)
Используется тестовый ввод
Учитывая сложность, с которой вы столкнулись, пара шагов по устранению неполадок и сравнения являются оправданными. С вашим постом вывода, вывод вашей команды:
mysql --user ${DBUSER} ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';"
должен быть:
1223121219 667
3223121219 2005
5223121219 545454
Итак, давайте протестируем с простым входным файлом. Сохраните то, что выше, в файл на вашем компьютере. У меня это в sqlout
, например,
$ cat sqlout
1223121219 667
3223121219 2005
5223121219 545454
Теперь измените скрипт для чтения файла вместо процесса замены , например
#!/bin/bash
declare -A result
while read -r phone userattr; do
result[$userattr]=$phone
done < sqlout
echo "${#result[@]} entries"
for attrib in "${!result[@]}"; do
printf "%-8s : %s\n" "$attrib" "${result[$attrib]}"
done
Затем запустите скрипт и убедитесь, что вы получаете все выходные данные, например,
Пример использования / Вывод
$ bash readmysql.sh
3 entries
545454 : 5223121219
2005 : 3223121219
667 : 1223121219
Дайте мне знать, если вы не получите тот же вывод, и мы будет go оттуда.