Сохранить запрос в массиве в bash - программирование
Подтвердить что ты не робот

Сохранить запрос в массиве в bash

My script необходимо сохранить в структуре результат запроса:

 #!/bin/bash
 user="..."
 psw="..."
 database="..."
 query="select name, mail from t"
 customStructure=$(mysql -u$user -p$psw $database -e "$query";)

Я не знаю, как сохранить массив {name, mail} из результата запроса.

Мне нужна структура вроде этого:

 array=[ [name1,mail1] , [name2,mail2], ....., [nameN, mailN] ]

Есть ли способ сделать это в bash?

4b9b3361

Ответ 1

Bash массивы инициализируются следующим образом:

myarray=("hi" 1 "2");

Чтобы захватить отдельные части вывода команды в массив, мы должны пропустить вывод, добавив его в массив. Это можно сделать так:

for i in `echo "1 2 3 4"`
do
    myarray+=($i)
done

В вашем примере, похоже, вы хотите получить вывод команды MySQL и сохранить части его выходных строк в подмассивах. Я покажу вам, как записывать строки в массивы, и, учитывая это, вы должны быть в состоянии выяснить, как поместить в него субмартины.

while read line
do 
    myarray+=("$line")
done < <(mysql -u${user} -p${psw} ${database} -e "${query}")

Также стоит упомянуть, что для такого рода операций MySQL, где вам не нужны выходные метаданные (такие как симпатичное форматирование и имена таблиц), вы можете использовать опцию MySQL -B для выполнения "пакетного вывода".

Ответ 2

Доступ к записи на уровне поля можно получить с помощью команды read -a, а IFS - пустая строка, которая предотвращает чтение от удаления верхнего и конечного пробелов из строки.

#!/bin/bash
user="..."
psw="..."
database="..."
query="select name, mail from t"

OIFS="$IFS" ; IFS=$'\n' ; oset="$-" ; set -f

while IFS="$OIFS" read -a line 
do 
  echo ${line[0]}   
  echo ${line[1]}   
done < <(mysql  -u${user} -p${psw} ${database} -e "${query}")