Скрипт Bash Script через MySQL - PullRequest
16 голосов
/ 07 мая 2011

Мне нужен скрипт bash, который может извлекать данные 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. Заранее спасибо.

Ответы [ 4 ]

42 голосов
/ 07 мая 2011

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

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
6 голосов
/ 07 мая 2011

Вместо вывода 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}'
4 голосов
/ 01 сентября 2015

Принятый ответ не работает, если на выходе есть пробелы. Это легко исправить (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

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

1 голос
/ 09 сентября 2015

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

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

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

while read field1 field2 field3
do
done < <(mysql -NB -e "$sql")
#     ^
#   space needed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...