Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Вопрос про if ... then ...

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Unix
Предыдущая тема :: Следующая тема  
Автор Сообщение
a-m-d



Зарегистрирован: 09.09.2004
Сообщения: 1498
Откуда: SPb

СообщениеДобавлено: Пн Май 30 2005 15:24    Заголовок сообщения: Вопрос про if ... then ... Ответить с цитатой

Подскажите, граждане...

Есть (в упрощении) вот такая вот конструкция

Код:

#!/bin/sh
actrule=`/sbin/ipfw show 11100 2>&1`

if [ ${actrule} != "ipfw: rule 11100 does not exist" ]; then
/sbin/ipfw delete 11100
fi


Результат выполнения файла:
[: ipfw:: unexpected operator

Как заставить сравниться строку, успешно выводимую по "echo ${actrule}" c текстом "ipfw: rule 11100 does not exist"

ЗЫ Наверное, else должна быть в курсе... Smile
ЗЗЫ Ах, да! FreeBSD 4.10 Smile
_________________
Век живи - век учись!.. Дураком помрёшь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
crash



Зарегистрирован: 02.11.2001
Сообщения: 1836
Откуда: Бердск

СообщениеДобавлено: Пн Май 30 2005 16:44    Заголовок сообщения: Ответить с цитатой

Код:
#!/bin/sh
actrule=`/sbin/ipfw show 11100 2>&1`

if [ "$actrule" != "ipfw: rule 11100 does not exist" ]; then
/sbin/ipfw delete 11100
fi
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
a-m-d



Зарегистрирован: 09.09.2004
Сообщения: 1498
Откуда: SPb

СообщениеДобавлено: Вт Май 31 2005 08:19    Заголовок сообщения: Ответить с цитатой

Crash, спасибо! Заработало так, как ожидалосьSmile

Как я понял, фигурные скобки интерпретировались как последовательность, которую надо просто выполнить.

А может еще что надо бы тут переделать?
_________________
Век живи - век учись!.. Дураком помрёшь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 10:39    Заголовок сообщения: предела совершенству не существует Ответить с цитатой

a-m-d писал(а):
Crash, спасибо! Заработало так, как ожидалосьSmile

Как я понял, фигурные скобки интерпретировались как последовательность, которую надо просто выполнить.
Нет, фигурные скобки в данном случае ни при чём. Просто результат подстановки содержит пробелы, поэтому для команды "открывающая квадратная скобка" оказываются неправильными аргументы, а двойные кавычки объединяют всё содержимое переменной actrule в один оргумент.

a-m-d писал(а):
А может еще что надо бы тут переделать?
[ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
---------------------------
предела совершенству не существует
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
crash



Зарегистрирован: 02.11.2001
Сообщения: 1836
Откуда: Бердск

СообщениеДобавлено: Вт Май 31 2005 10:53    Заголовок сообщения: Re: предела совершенству не существует Ответить с цитатой

критикан писал(а):
[ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
---------------------------
предела совершенству не существует

это вы предлагаете запустить вместо структуры if?
если да то вопрос, а вы проверили работоспособность?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 14:55    Заголовок сообщения: найден предел совершенству! это разбитый лоб дурака Ответить с цитатой

crash писал(а):
если да то вопрос, а вы проверили работоспособность?
Вообще говоря, на такие вопросы я не отвечаю, так как рассматриваю их равноценными предложениям типа "глупость", "дурак", "неуч" и т. п.
Вас не устраивает предложение? Или Вы считаете, что оно не является равноценной заменой оператора "if"? Если это так, так скажите, что в нём неправильно. И докажите это, а устраивать экзамен идите куда-нибудь, куда сами решите.
-----------------------
найден предел совершенству! это разбитый лоб дурака
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
crash



Зарегистрирован: 02.11.2001
Сообщения: 1836
Откуда: Бердск

СообщениеДобавлено: Вт Май 31 2005 16:16    Заголовок сообщения: Re: найден предел совершенству! это разбитый лоб дурака Ответить с цитатой

критикан писал(а):
crash писал(а):
если да то вопрос, а вы проверили работоспособность?
Вообще говоря, на такие вопросы я не отвечаю, так как рассматриваю их равноценными предложениям типа "глупость", "дурак", "неуч" и т. п.

ну это дело ваше. я просто просил ответить, а не рассказывать кто, кого и кем считает. а вы начали тут полемику разводить вместо того чтобы ответить "да" или "нет".
критикан писал(а):
Вас не устраивает предложение? Или Вы считаете, что оно не является равноценной заменой оператора "if"? Если это так, так скажите, что в нём неправильно. И докажите это, а устраивать экзамен идите куда-нибудь, куда сами решите.

лично меня устраивает все, главное чтобы устроило того кто спросил.
насчет экзамена это не ко мне, мне бы самому ответить на что-нибудь.
доказывать тоже не буду, просто интересно было
Цитата:
diamondmir# [ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
[: !=: unexpected operator
diamondmir#
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 16:47    Заголовок сообщения: Re: найден предел совершенству! это разбитый лоб дурака Ответить с цитатой

crash писал(а):
diamondmir# [ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
[: !=: unexpected operator
diamondmir#
попробуйте так:
[ "-`/sbin/ipfw show 11100 2>&1`" != "-ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
dio



Зарегистрирован: 07.10.2004
Сообщения: 722
Откуда: Дважды орденоносная Кубань,Краснодар

СообщениеДобавлено: Вт Май 31 2005 16:56    Заголовок сообщения: Re: найден предел совершенству! это разбитый лоб дурака Ответить с цитатой

критикан писал(а):
crash писал(а):
если да то вопрос, а вы проверили работоспособность?
Вообще говоря, на такие вопросы я не отвечаю, так как рассматриваю их равноценными предложениям типа "глупость", "дурак", "неуч" и т. п.
Вас не устраивает предложение? Или Вы считаете, что оно не является равноценной заменой оператора "if"? Если это так, так скажите, что в нём неправильно. И докажите это, а устраивать экзамен идите куда-нибудь, куда сами решите.
-----------------------
найден предел совершенству! это разбитый лоб дурака

Как это было нехорошо....crash уважаемый человек и ДАВНО известный.... Confused
_________________
All is not lost! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
crash



Зарегистрирован: 02.11.2001
Сообщения: 1836
Откуда: Бердск

СообщениеДобавлено: Вт Май 31 2005 16:59    Заголовок сообщения: Re: найден предел совершенству! это разбитый лоб дурака Ответить с цитатой

критикан писал(а):
crash писал(а):
diamondmir# [ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
[: !=: unexpected operator
diamondmir#
попробуйте так:
[ "-`/sbin/ipfw show 11100 2>&1`" != "-ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100

так лучше, но нет проверки все равно. то есть соблюдается равенство или нет, результат один и тот же
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 17:01    Заголовок сообщения: 2dio: flame? Press ignore to continue... (-) Ответить с цитатой

2dio:
Already pressed


Последний раз редактировалось: критикан (Вт Май 31 2005 17:15), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 17:14    Заголовок сообщения: зачем молиться? неужели "ради бога"? Ответить с цитатой

crash писал(а):
критикан писал(а):
[ "-`/sbin/ipfw show 11100 2>&1`" != "-ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100

так лучше, но нет проверки все равно. то есть соблюдается равенство или нет, результат один и тот же
"man sh" говорит, что в двух командах, соединённых оператором "&&", вторая команда выполняется, если первая завершается с нулевым кодом завершения. Эта ситуация идентична конструкции "if", если в конструкции "if" между "then" и "fi" стоит одна команда. Кстати, пустой вывод первой команды (именно его Вы привели при демонстрации ошибочного исполнения составной команды) вызывает ошибку в обоих случаях, так как это не ошибка конструкции "if"/"&&", а ошибка некорректных аргументов команды "test". Поэтому "минус" следует ставить в обоих случаях.
----------------------
зачем молиться? неужели "ради бога"?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
crash



Зарегистрирован: 02.11.2001
Сообщения: 1836
Откуда: Бердск

СообщениеДобавлено: Вт Май 31 2005 17:26    Заголовок сообщения: Re: зачем молиться? неужели "ради бога"? Ответить с цитатой

критикан писал(а):
crash писал(а):
критикан писал(а):
[ "-`/sbin/ipfw show 11100 2>&1`" != "-ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100

так лучше, но нет проверки все равно. то есть соблюдается равенство или нет, результат один и тот же
"man sh" говорит, что в двух командах, соединённых оператором "&&", вторая команда выполняется, если первая завершается с нулевым кодом завершения.

man я читал тоже.
но я говорю что не работает оба ваших варианта.
хотя пусть тестирует вопрошающий))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Вт Май 31 2005 17:51    Заголовок сообщения: зачем молиться? богу это не надо, ему надо жить по-божески! Ответить с цитатой

crash писал(а):
не работают оба ваших варианта
К сожалению у меня нет под рукой юникса с фаеруоллом, поэтому не могу посмотреть, что выводит команда

/sbin/ipfw show 11100 2>&1

если в выходном потоке команды есть символы двойных кавычек, то команда test отработает неправильно, и нужно предварительно обработать выходной поток текстовым обработчиком. Но в любом случае это ошибка аргументов команды test, а не конструкций if/&&. Г-н a-m-d сказал, что работает такой пакет:
Код:
#!/bin/sh
actrule=`/sbin/ipfw show 11100 2>&1`
if [ "$actrule" != "ipfw: rule 11100 does not exist" ]; then
/sbin/ipfw delete 11100
fi
но тогда должен работать и такой пакет
Код:
#!/bin/sh
[ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
потому что они равноценны. Общее правило такое: в текстовые аргументы команды test вводятся дополнительные символы для предотвращения пустых аргументов. В заключении такой пример:
Код:
[ "-`echo 1 2 3`" = "-1 2 3" ] && echo ok
выведет ok, а
Код:
[ "-`echo 1 2 3`" != "-1 2 3" ] && echo ok
ничего не выведет.
------------------
зачем молиться? богу это не надо, ему надо жить по-божески!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
a-m-d



Зарегистрирован: 09.09.2004
Сообщения: 1498
Откуда: SPb

СообщениеДобавлено: Ср Июн 01 2005 09:12    Заголовок сообщения: Re: зачем молиться? неужели "ради бога"? Ответить с цитатой

crash писал(а):
...хотя пусть тестирует вопрошающий))


Ага. Согласен Smile

Сейчас неотложности подразгребу, подразберусь, чего тут с вечера появилось и отпишусь.

Как я уже говорил, конструкция приводилась упрощенная (минимум, где выползала ошибка), на самом деле и действующее правило $actrule и его номер 11100 вычисляются, и в зависимости от вышестоящего условия (лимит трафика Smile ) правило с найденным номером должно либо создаваться, либо удаляться, либо оставаться как есть.
_________________
Век живи - век учись!.. Дураком помрёшь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
a-m-d



Зарегистрирован: 09.09.2004
Сообщения: 1498
Откуда: SPb

СообщениеДобавлено: Ср Июн 01 2005 10:42    Заголовок сообщения: Re: зачем молиться? богу это не надо, ему надо жить по-божески! Ответить с цитатой

критикан писал(а):
К сожалению у меня нет под рукой юникса с фаеруоллом, поэтому не могу посмотреть, что выводит команда

/sbin/ipfw show 11100 2>&1


Выводится либо правило 11100 со счетчиками, либо ipfw: rule 11100 does not exist. Двойных кавычек в выводе не замечено.

критикан писал(а):
...Г-н a-m-d сказал, что работает такой пакет:
Код:
#!/bin/sh
actrule=`/sbin/ipfw show 11100 2>&1`
if [ "$actrule" != "ipfw: rule 11100 does not exist" ]; then
/sbin/ipfw delete 11100
fi
но тогда должен работать и такой пакет
Код:
#!/bin/sh
[ "`/sbin/ipfw show 11100 2>&1`" != "ipfw: rule 11100 does not exist" ] && /sbin/ipfw delete 11100
потому что они равноценны...


Проверил, подтверждаю, в моем примере работает. Правило с номером 11100 удаляется.

А
Код:
#!/bin/sh
[ "`/sbin/ipfw show 11100 2>&1`" = "ipfw: rule 11100 does not exist" ] && /sbin/ipfw add 11100 deny ip from 111.111.111.111 to any

создает правило в случае его отсутствия и ничего не делает, если какое-либо правило 11100 уже существует.
_________________
Век живи - век учись!.. Дураком помрёшь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Unix Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...