Bash (syntax error near unexpected token `done')

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
kapa
Сообщения: 143

Bash

Сообщение kapa »

bash 3.00.16
Пишу:

Код: Выделить всё

while :
do check_kassir() {
if mount_smbfs -I 192.168.1.25 -N -W OFIS //ROOT@STOUN/123 /123 | grep "Operatio
n timed out" > /dev/null;
then sleep 300;
elif
/root/refresh_mac_ip;
exit }
check_kassir
sleep 3;
done


Выдаёт:

Код: Выделить всё

./mount_kassir: line 10: syntax error near unexpected token `done'
./mount_kassir: line 10: `done'


Я не силён в программировании - никак не могу понять в чём ошибка.
Не подскажете?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Bash

Сообщение madskull »

вместо elif подразумевалось fi , видимо.
Вообще-то странно все это. Почему бы не вынести объявление функции за цикл?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
kapa
Сообщения: 143

Re: Bash

Сообщение kapa »

madskull писал(а):
27.02.2006 18:36
вместо elif подразумевалось fi , видимо.
Вообще-то странно все это. Почему бы не вынести объявление функции за цикл?

на fi он ругается так же как и на done
не вынести за цикл, потому что комп кассира может выключаться и включаться, ровно как и ребутиться маршрутер, на котором это должно крутиться, а скрипт, который обновляет пары ip-mac - как раз тащит их с компа кассира. (по-другому не придумал как реализовать)
Спасибо сказали:
Аватара пользователя
JaGoTerr
Сообщения: 380

Re: Bash

Сообщение JaGoTerr »

(madskull @ Feb 27 2006, в 18:36) писал(а):вместо elif подразумевалось fi , видимо.

Скорее всё же else.

А elif должен быть с условием, а не сам по себе.

(kapa @ Feb 27 2006, в 18:43) писал(а):не вынести за цикл, потому что...

Вынести нужно не вызов, а определение! Ибо оное в цикле не может быть оправдано никакой задачей.
Типа того:

function check () {
#всё что угодно
}


while true; do
check
done
Спасибо сказали:
Аватара пользователя
kapa
Сообщения: 143

Re: Bash

Сообщение kapa »

спасибо, сделал так:

Код: Выделить всё

if mount_smbfs -I 192.168.1.25 -N -W OFIS //ROOT@STOUN/123 /123 | grep "Operatio
n timed out";# > /dev/null;
then echo "no connection";
sleep 30;
else
/root/refresh_mac_ip;
fi;
}
while true; do
check_kassir
sleep 3;
done


монтирует, но на fi ругается постоянно также
Спасибо сказали:
WolfON
Сообщения: 226

Re: Bash

Сообщение WolfON »

echo done
попробуй
ArchLinux on AXP2000+/768/ATI R9600XT
Registered Linux User 396336
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Bash

Сообщение ddc »

kapa
А если убрать ';'?
Спасибо сказали:
Аватара пользователя
Shura
Сообщения: 1537
Статус: Оказывается и без KDE есть жизнь
ОС: FreeBSD 8.0-RC2

Re: Bash

Сообщение Shura »

у меня было похожее. Возьми условие в скобки.
Rock'n'roll мертв © БГ
Спасибо сказали:
Nab
Сообщения: 257
Контактная информация:

Re: Bash

Сообщение Nab »

блин, я наверно устарел :)
ну а если условие-то в квадратные скобки включить?
по правилам....
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Bash

Сообщение madskull »

Никаких скобок не надо.
Но я сомневаюсь, что тот код, который привел kapa вообще работает.
Поскольку нет объявления функции. А раз нет ее, то я склонен подозревать, что мы еще что-то не видим.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Sparky
Сообщения: 604
Статус: core dumped
ОС: Plan 9

Re: Bash

Сообщение Sparky »

madskull писал(а):
28.02.2006 17:00
Никаких скобок не надо.
Но я сомневаюсь, что тот код, который привел kapa вообще работает.
Поскольку нет объявления функции. А раз нет ее, то я склонен подозревать, что мы еще что-то не видим.

Я так понимаю он вот так вот объявляет какраз:

Код: Выделить всё

check_kassir() {
if mount_smbfs -I 192.168.1.25 -N -W OFIS //ROOT@STOUN/123 /123 | grep "Operatio
n timed out" > /dev/null;
then sleep 300;
elif
/root/refresh_mac_ip;
exit }


Тоесть должно быть что то вроде этого:

Код: Выделить всё

#!/bin/bash
function check_kassir() {
if mount_smbfs -I 192.168.1.25 -N -W OFIS //ROOT@STOUN/123 /123 | grep "Operatio
n timed out" > /dev/null; // что вернет эта строка if?
then  sleep 300;
elif
/root/refresh_mac_ip;
exit
}

while ....
Блог
--------------------

GCS/M/MU/P/IT/E d- s: a- C++(+++) UBL++ P->-- L+++$ E- W+++$ N* o? K? w>--
O M-@ V- PS@ PE+ Y+ PGP+ t 5 X R* tv-->- b++ DI? D>+ G e+(++) h--- r+ y++
Спасибо сказали:
Аватара пользователя
kapa
Сообщения: 143

Re: Bash

Сообщение kapa »

ещё раз всем спасибо, к сожалению, сегодня не мог попробовать что-то изменить - постараюсь завтра и обязательно отпишусь

2 madskull:

прошу прощения, в своём ответе - верх случайно обрезал...
сделал всё как советовал JaGoTerr
Спасибо сказали:
Ответить