URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9764
[ Назад ]

Исходное сообщение
"Запарка с логическими операторами bash"

Отправлено Purpur , 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 и всякие циклы не интересуют, ибо уже сделаны.
Буду благодарен за любую подсказку.


Содержание

Сообщения в этом обсуждении
"Запарка с логическими операторами bash"
Отправлено Purpur , 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


"Запарка с логическими операторами bash"
Отправлено pavlinux , 30-Окт-13 03:57 
> Я дятел, не могущий в синтаксис

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

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

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


"Запарка с логическими операторами bash"
Отправлено Purpur , 30-Окт-13 08:06 
Представь себе, могут. Про данные утилиты мне известно, хотелось сделать именно проверку порта через nmap. Мой вопрос был исключительно по синтаксису, и то - я уже жалею, что его задал.

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

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

man bash|wc

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


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

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


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

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


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

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


"Запарка с логическими операторами bash"
Отправлено Andrey Mitrofanov , 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


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

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