Tomsk Sysadmins Forum

Unix => Программирование => Topic started by: lsk on June 02, 2006, 14:33:18

Title: Bash + SQL
Post by: lsk on June 02, 2006, 14:33:18
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен
Title: Bash + SQL
Post by: Satan on June 02, 2006, 15:44:44
Quote from: lsk
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен

mysql db -e 'mysqlquerry'

mysql test -e 'SELECT * FROM tab' например - в шеле получишь вывод - что с ним делать решать тебе и писать уже на sh
Title: Bash + SQL
Post by: lsk on June 02, 2006, 23:33:20
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура
Title: Bash + SQL
Post by: demiurg on June 03, 2006, 00:02:34
Quote from: lsk
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура
А может все таки документацию по mysql и по bash почитать.
Естественно, что это баш пытается выполнить скрипт по строчно, нужно писать в одной строке и не забыть ключик -e.
Или Вы думаете, что волшебным образом управление перейдет от баша к mysql и дальше скрипт будет интерпретировать mysql?
Вероятнее выглядеть должно так
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e "SELECT `ip`, `check` FROM `user` WHERE `check`=1;"`$RESULT содержит результат и с ним можно работать дальше.
Я бы конечно не насиловал себя башем, а написал скрипт на перле.
Title: Bash + SQL
Post by: lsk on June 03, 2006, 00:29:35
хм, да чего только я уже не пробывал и встрочку и "в столбик" все уже пробывал и -e и другие ключи, все равно баш "думает", что это его команды
вот что ваша строчка выдает с использованием моих данных:
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file
./sqlbash: line 7: ,: command not found
./sqlbash: line 7: FROM: command not found
./sqlbash: line 7: WHERE: command not found
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file
Title: Bash + SQL
Post by: lamaka on June 03, 2006, 01:49:23
что-то мне подсказывает что строчка неправильно приведена.
Title: Bash + SQL
Post by: mikk on June 03, 2006, 12:00:03
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.
Title: Bash + SQL
Post by: demiurg on June 03, 2006, 12:11:07
Quote from: mikk
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.
Да, я как-то не обратил внимание на то, что там апострофы "обратные", тут два выхода -- или заменить их прямыми или заключить команду в одинарные кавычки
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;'`За подробным объяcнением фокуса с "" и '' отправляю в man bash
Title: Bash + SQL
Post by: Satan on June 03, 2006, 14:29:49
Quote from: lsk
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура

А потому и пишет, что за один раз в sh выполняется только одна строка и нельзя делать какую-то последовательность комманд.

Тебе это надо всё скопом передавать. Потому, выглядеть это должно вот так:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=****** -e '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"'
символом ' можно переносить строки, есть ещё такие символы, т.е. можно написать тоже самое вот так и будет работать
Code: [Select]
mysql -h localhost  -u root  -p db_test --password=****** -e '
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
'
Title: Bash + SQL
Post by: lsk on June 03, 2006, 14:30:00
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки

SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1
Title: Bash + SQL
Post by: Satan on June 03, 2006, 14:34:36
Quote from: lsk
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки

SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1

mysql -h localhost  -u root  -p db_test --password=****** -e '
SELECT ip, check FROM user WHERE check=1
'
вот так напиши и не парься
Title: Bash + SQL
Post by: lsk on June 03, 2006, 14:46:54
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'
Title: Bash + SQL
Post by: Satan on June 03, 2006, 14:52:45
Quote from: lsk
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'

вообще наличие кавычек ' ` или " зависит как-то напрямую от того в какой кодировке собрал mysql - я сам не знаю почему, но допустим конструкция с обратными кавычками у кого-то может не сработать, зато сработает вариант совсем без них
Title: Bash + SQL
Post by: Safir on June 04, 2006, 10:28:36
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.
Title: Bash + SQL
Post by: demiurg on June 04, 2006, 22:40:22
Quote from: Safir
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.
Видимо потому, что автор вопроса даже не удосужился хоть раз почитать руководство по bash, да он даже советов не слушает.
Code: [Select]
mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;' Прекрасно работает.
На крайний случай экранирование спец символов тоже никто не отменял
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT \`ip\`, \`check\` FROM \`user\` WHERE \`check\`=1;'`
echo $RESULT;