Подтвердить что ты не робот

Bash Script Loop Through MySQL

Мне нужен bash script, который может извлекать данные MySQL из удаленной базы данных. На самом деле, я сделал это, но теперь мне нужно, чтобы он выполнял записи через записи и передавал переменную в другой файл bash. Здесь мой вызов MySQL:

mysql -X -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' > themes.xml
download_themes.sh

Он экспортирует данные в xml файл с именем theme.xml прямо сейчас, я просто пытался выяснить какой-то способ прокрутки данных. Я пытаюсь избежать PHP и Perl и просто пытаюсь использовать bash. Спасибо заранее.

4b9b3361

Ответ 1

что-то вроде:

mysql -e "SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read theme_name guid; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done

: команда mysql выводит запись, разделенную "\n", и поля, разделенные "\ t", когда вывод является каналом. команда read считывает строку, разбивается на поля и помещает каждую из переменных.

Если ваши данные имеют пробелы в полях, возникают проблемы с расщеплением read по умолчанию. есть некоторые пути вокруг него; но если вы только читаете два поля, и у одного из них не должно быть пробелов (например, guid), тогда вы можете поставить "опасное" поле в конце, а read поместит все "лишние", в последней переменной.

вот так:

mysql -e "SELECT `guid` `theme_name`, FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read guid theme_name; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done

Ответ 2

Вместо вывода XML я могу предложить вам просто использовать синтаксис SELECT INTO OUTFILE или mysql --batch --raw для вывода значений, разделенных табуляцией. Затем вам легче получить доступ через bash к остальной части инструментальной цепочки Unix, например cut и awk, для получения необходимых полей и повторного использования их с помощью Bash. Никакой другой язык сценариев не требуется, и вам не нужно связываться с XML.

mysql --batch --raw -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' \
| awk '{print "theme: " $1  " guid: " $2}'

Ответ 3

Принятый ответ не работает, когда на выходе находятся пробелы. Это простое исправление (IFS = $'\ t' - обратите внимание на $- это странно):


>mysql ... -BNr -e "SELECT 'funny man', 'wonderful' UNION SELECT 'no_space', 'I love spaces';" | while IFS=$'\t' read theme_name guid; do echo "theme: $theme_name guid: $guid"; done
theme: funny man guid: wonderful
theme: no_space guid: I love spaces

Вы, конечно, захотите заменить свой собственный запрос.

Ответ 4

Труба '|' пока что это опасно, поскольку изменения внутри цикла происходят в другом подпроцессе и не будут вступать в силу в текущем script.

Кстати, мне не нравится обращаться к внешнему файловому решению.

Я предлагаю использовать " Замена процесса".

while read field1 field2 field3
do
done < <(mysql -NB -e "$sql")
#     ^
#   space needed