Получить значения сценария оболочки и установить переменные - PullRequest
1 голос
/ 21 января 2020

Как можно разделить значения, полученные в массиве, согласно строке поиска? Пример: я использую этот код:

#!/bin/bash
#Ref =  https://www.linuxquestions.org/questions/programming-9/bash-to-loop-thorouh-mysql-select-array-882907/#post5798608#
#
DBUSER="user"
DBNAME="pass"
results=($(mysql --user ${DBUSER}  ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';"))
cnt=${#results[@]}

for (( i=0; i<${cnt}; i++ ))
do
    echo "Total. $i: ${results[$i]} "

#    NumPhone1=${results[0]};
#    CodPhone1=${results[1]};
#    NumPhone2=${results[2]};
#    CodPhone2=${results[3]};

echo "---------------------------------------------------------------------------------------------------"
done

Результат:

Total. 0: 1223121219
---------------------------------------------------------------------------------------------------
Total. 1: 667
---------------------------------------------------------------------------------------------------
Total. 2: 3223121219
---------------------------------------------------------------------------------------------------
Total. 3: 2005
---------------------------------------------------------------------------------------------------
Total. 4: 5223121219
---------------------------------------------------------------------------------------------------
Total. 5: 545454
---------------------------------------------------------------------------------------------------

Могут ли они выглядеть так? REF: L oop через массив строк в Bash? Создание ассоциативного массива. Словарь:

declare -A continent

continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America

for item in "${!continent[@]}"; 
  do
    printf "$item is in ${continent[$item]} \n"
  done
Output:

 Argentina is in America
 Vietnam is in Asia
 France is in Europe

var1 = 1223121219 и var2 = 667 var3 = ... и var4 = ... ... ...

Ответы [ 2 ]

0 голосов
/ 22 января 2020
mysql> select * from usersSis;
+----+-------+-------------+----------+------------+---------+
| id | ipNow | phonenumber | userattr | dateExpire | sendMSG |
+----+-------+-------------+----------+------------+---------+
|  1 | NULL  | 1223121219  | 667      | NULL       | 0       |
|  2 | NULL  | 3223121219  | 2005     | NULL       | 0       |
|  3 | NULL  | 5223121219  | 545454   | NULL       | 0       |
+----+-------+-------------+----------+------------+---------+
3 rows in set (0.00 sec)

mysql>

Результат cod: root@us: / var / www/html/arquivos# ./script.sh 545454: 2005: 667:

в сценарии> Пример кода сценария = D

0 голосов
/ 21 января 2020

Если я понимаю, что формат результата вашего запроса равен "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 оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...