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. Спасибо заранее.
Ответы
Ответ 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