LINUX.ORG.RU

bash и mysql

 , ,


0

3
DB_USER='test';
DB_PASSWD='pass';
DB_NAME='mu_site';

count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse "select online from TABLE where client=8620;")
if [ $count -gt 0 ]
then
     echo "1"
else
     echo "0"
fi

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'TABLE where client=8620' at line 1 ./mysql.sh: line 34: [: -gt: unary operator expected 0

Подскажите что я делаю не так? Нужно сделать условие если в базе есть client который равен 8620 вывести «1»



Последнее исправление: Dima85 (всего исправлений: 1)

Сама команда count что возвращает?

Если все корректно, попробуйте экранировать ' ' $count в условии if

Aborigen1020
()
Ответ на: комментарий от crutch_master
count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse "select online from `TABLE` where client=8620")

не помогло: ./mysql.sh: line 33: TABLE: command not found ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'where client=8620' at line 1 ./mysql.sh: line 34: [: -gt: unary operator expected

Dima85
() автор топика
Ответ на: комментарий от Dima85

Баш всё, что в ` пытается выполнить и вернуть выхлоп. Читай ошибку же ну.

TABLE: command not found

Экранируй ` или переименовывай свой TABLE или еще что-то.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от gnu_linux
count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse 'select online from TABLE where client=8620')

тоже пробовал. Та же ошибка. и 8620 экранировал, ничего не помогает.

Dima85
() автор топика
Ответ на: комментарий от Dima85

Так попробуй:

count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse 'select online from \`TABLE\` where client=8620')

crutch_master ★★★★★
()
Ответ на: комментарий от gnu_linux

Проше прощения. Комментирование TABLE без косых выдало следующею ошибку:

count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse 'select online from `TABLE` where client=8620')

ERROR 1146 (42S02) at line 1: Table 'mu_site.TABLE' doesn't exist
./mysql.sh: line 35: [: -gt: unary operator expected
 lower than 0 
Комментирование TABLE С косыми выдало следующею ошибку:
count=$(mysql -h localhost -u$DB_USER -p$DB_PASSWD -D$DB_NAME -sse 'select online from \`TABLE\` where client=8620')

ERROR at line 1: Unknown command '\`'.
./mysql.sh: line 35: []: command not found
 lower than 0 

Dima85
() автор топика
Ответ на: комментарий от Dima85

Проше прощения. Комментирование TABLE без косых выдало следующею ошибку:

Ну всё, bash - ок. Заставь теперь sql работать. Где там у тебя эта таблица лежит? Запрос вообще выполняется? Переименуй TABLE лучше на что-нибудь вменяемое.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Сообразил. С mysql разобрался. Все работает. Спасибо! Осталось сравнение

./mysql.sh: line 37: [23: command not found
 lower than 0 

Ругается на эту строчку

if [$count -gt 0]

gnu_linux пишет у меня не число 0, а символ '0'. Как Его превратить в число?

Dima85
() автор топика
Ответ на: комментарий от Dima85
-if [$count -gt 0]
+if [ $count -gt 0 ]

Баш подставляет 23 и получается [23, а [ это тоже самое что test, 23 для которого - это ключ.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

проблема в том, что если клиент а с соотв. номером нет - ты не получаешь записей в результате запроса.
делай

 select count(1) from  TABLE where client=8620;

чтобы узнать кол-во записей с этим условием. может быть 0 или больше. можешь его дальше в баше анализировать.
если тебе всетаки нужно значение поля online если пользователь существует можешь сделать
 select count(1), ifnull(online, -1)  from  TABLE where client=8620;

и анализировать два поля. во втором будет online или -1 если записи нет(какое удобно туда значение вставь). тут есть подводный камень в виде дубликатов. если в таблице будет много записей с client=8620 то ты получишь много строк и приколы в парсинге. решается limit-ом на уровне запроса, уникальными констрейтами на уровне таблицы.

bl ★★★
()

[: -gt: unary operator expected 0

для случая, когда твой запрос count=$(..) ничего не возвращает можно сделать так:

if [ ${count:-0} -gt 0 ]
then
     echo "1"
else
     echo "0"
fi

или использовать конструкцию

 select IFNULL(online, 0) from ...
в твоем запросе, чтоб возвращало 0 когда запрос ничего не возвращает.

nerve ★★
()

Во-первых, пароль может содержать спец-символы и их надо экранировать: "-p$DB_PASSWD".

Во-вторых, вы указали, что у вас bash, а используете синтаксис [ ], который не работает с пустыми переменными. Надо либо [[ ]], либо как тут вам сказали насчёт ${count:-0}.

Код из коммента if [$count -gt 0] невалидный, надо пробелы везде.

Точки с запятой при командах по одной на строку не нужны, это к объявлениям значений переменных.

vodz ★★★★★
()
Ответ на: комментарий от bl

bl, можно с вами лично как-то пообщаться в интернете? Есть еще несколько вопросов в которых я не компетентен. Я очень буду рад если вы согласитесь помочь за несколько кружек кофе, или чего-то покрепче. :)

Dima85
() автор топика

По идее нужно после -u и после -D пробел типа так:

count=$(mysql -h localhost -u $DB_USER -p$DB_PASSWD -D $DB_NAME -sse «select online from TABLE where client=8620;»)

romanlinux ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.