The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Запарка с логическими операторами bash"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Запарка с логическими операторами bash"  +/
Сообщение от Purpur (ok) on 25-Окт-13, 12:46 
Приветствую всех. Есть кусок скрипта :

#!/bin/bash
res=0
Google=$(nmap 8.8.8.8 -p 53 | grep 53/tcp)
[[ $Google == 53* ]] && resGoogle=$(echo "DNS Google доступен -- `date`") || resGoogle=$(echo "!!! DNS Google НЕ ДОСТУПЕН -- `date`") && ((res++))
echo $resGoogle

Mail=$(nmap mail.ru -p 80 | grep 80/tcp)
[[ $Mail == 80* ]] && resMail=$(echo "mail.ru доступен --        `date`") || resMail=$(echo "!!! MAIL.RU НЕ ДОСТУПЕН -- `date`") && ((res++))
echo $resMail

Суть в следующем - тыкаемся nmap'ом в порт; если соединение есть, то выводим информацию, что сервис доступен, если соединения нет, то выводим информацию, что сервис недоступен и увеличиваем значение переменной $res на единицу. И вот с увеличением значения этой переменной только при недоступности сервиса я и застрял. В приведённом выше варианте скрипт неработоспособен, т. к. значение переменной $res увеличивается на единицу в любом случае. Насколько я понимаю, суть сводится к как бы объединению блока кода, следующего за оператором "||", то есть, чтобы ((res++)) отрабатывал только в случае выполнения условия, следующего за этим оператором. Если несложно, подскажите, как можно это реализовать, исходя из приведённой выше конструкции? Варианты If-then-else и всякие циклы не интересуют, ибо уже сделаны.
Буду благодарен за любую подсказку.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Запарка с логическими операторами bash"  +/
Сообщение от Purpur (ok) on 25-Окт-13, 13:14 
Я дятел, не могущий в синтаксис :(
Все просто оказалось.

#!/bin/bash
res=0
Google=$(nmap 8.8.8.8 -p 53 |grep 53/tcp)
[[ $Google = 53* ]] && resGoogle=$(echo "DNS Google доступен -- `date`") || { resGoogle=$(echo "!!! DNS Google НЕ ДОСТУПЕН -- `date`") && ((res++))
}
echo $resGoogle

Mail=$(nmap mail.ru -p 80 | grep 80/tcp)
[[ $Mail = 80* ]] && resMail=$(echo "mail.ru доступен --        `date`") || { resMail=$(echo "!!! MAIL.RU НЕ ДОСТУПЕН -- `date`") && ((res++))
}
echo $resMail

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Запарка с логическими операторами bash"  +/
Сообщение от pavlinux (ok) on 30-Окт-13, 03:57 
> Я дятел, не могущий в синтаксис

Хуже, ты веришь в то, что маил.ру и DNS гугла могут быть не доступны.

Более того, соответствующие сервисы проверяют соответствующими утилитами.

$ host google.com 8.8.8.8;
$ lynx mail.ru -dump

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Запарка с логическими операторами bash"  +/
Сообщение от Purpur (ok) on 30-Окт-13, 08:06 
Представь себе, могут. Про данные утилиты мне известно, хотелось сделать именно проверку порта через nmap. Мой вопрос был исключительно по синтаксису, и то - я уже жалею, что его задал.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Запарка с логическими операторами bash"  +/
Сообщение от Andrey Mitrofanov on 30-Окт-13, 11:06 
>Мой вопрос был исключительно по синтаксису, и то
> - я уже жалею, что его задал.

Проанализируй вывод

man bash|wc

и скажи дяде "спасибо". Он страдал, увидев твой "синтаксис".

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

7. "Запарка с логическими операторами bash"  +/
Сообщение от Purpur (ok) on 30-Окт-13, 11:14 
>>Мой вопрос был исключительно по синтаксису, и то
>> - я уже жалею, что его задал.
> Проанализируй вывод
> man bash|wc
> и скажи дяде "спасибо". Он страдал, увидев твой "синтаксис".

Спасибо. Я думаю, что это был мой второй и последний вопрос на данном форуме. Дабы не заставлять никого страдать.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "Запарка с логическими операторами bash"  +/
Сообщение от Andrey Mitrofanov on 30-Окт-13, 11:23 
> Спасибо. Я думаю, что это был мой второй и последний вопрос на
> данном форуме. Дабы не заставлять никого страдать.

2All оставшимся: Что-то не ладно в Форуме! Мы теряем не первую выпускницу института девиц (ой. не сексизм, нет-нет!). Надо же что-то менять.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "Запарка с логическими операторами bash"  +/
Сообщение от pavlinux (ok) on 31-Окт-13, 18:00 
> Представь себе, могут. Про данные утилиты мне известно, хотелось сделать именно проверку
> порта через nmap.

У многих заглушки висят - порт открыт, а сервис не работает.    

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

4. "Запарка с логическими операторами bash"  +/
Сообщение от Andrey Mitrofanov on 30-Окт-13, 10:52 
> [[ $Mail == 80* ]] && resMail=$(echo "mail.ru доступен --  
>      `date`") || resMail=$(echo "!!! MAIL.RU НЕ ДОСТУПЕН -- `date`") && ((res++))
> echo $resMail
> И вот с увеличением значения этой переменной только при недоступности сервиса я
> и застрял. В приведённом выше варианте скрипт неработоспособен, т. к. значение

Практика "[[ условие ]] && команда1 || команда2" _не рекомендуется_ многими. И твой код - собственно пример, почему.


1. { { [[ == 80* ]] && resMail=$(...) } || resMail=$(...) } && ((res++))
1.1. Группировка команд и приоритеты тут _совсем_ не те, к которым ты привык в... ЯВУ. Здесь исполнение слева направо по одному и _не исполнение_ _одной_ команды, если [ну вы в курсе]. И переход к _следующей.
2. присваимание var=... _обычно_ имеет RC=0, но _может_ иметь и не-OK код возврата при  $() вызовах внеш.программ (не в твоём коде: afaics date и echo обычно возвращают OK)

Поэтому
[[ условие ]] && var="строка1" || var="строка2"
работает, но с
[[ условие ]] && var="$(команда)" || var="строка2"
дело сложнее.
2.1. твой ((res++)) - частный (и более сложный, если угодно) случай этого

3. Три команды =много, но иногда можно. Четыре и с разными усл.операторами - почти всегда ошибка. В читаемости по кр.мере, даже если код _тщательно проверен и работает, "как надо".

> Если несложно, подскажите, как можно это реализовать, исходя из приведённой выше конструкции?

if [[ $Mail == 80* ]]; then
    resMail="mail.ru доступен --   `date`"
else
    resMail="!!! MAIL.RU НЕ ДОСТУПЕН -- `date`"
    let res++
fi

> echo $resMail

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Запарка с логическими операторами bash"  +/
Сообщение от Purpur (ok) on 30-Окт-13, 11:08 
> Практика "[[ условие ]] && команда1 || команда2" _не рекомендуется_ многими.
> И твой код - собственно пример, почему.
>...

Благодарю за комментарий. Через if-else сделал сразу, потом захотелось попробовать написать с использованием логических операторов. Это просто попытки решить одну задачу разными способами.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру