Сохранить запрос в массиве в 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?
Ответы
Ответ 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}")