Приветствую всех. Есть кусок скрипта :#!/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 $resGoogleMail=$(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 и всякие циклы не интересуют, ибо уже сделаны.
Буду благодарен за любую подсказку.
Я дятел, не могущий в синтаксис :(
Все просто оказалось.#!/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 $resGoogleMail=$(nmap mail.ru -p 80 | grep 80/tcp)
[[ $Mail = 80* ]] && resMail=$(echo "mail.ru доступен -- `date`") || { resMail=$(echo "!!! MAIL.RU НЕ ДОСТУПЕН -- `date`") && ((res++))
}
echo $resMail
> Я дятел, не могущий в синтаксисХуже, ты веришь в то, что маил.ру и DNS гугла могут быть не доступны.
Более того, соответствующие сервисы проверяют соответствующими утилитами.$ host google.com 8.8.8.8;
$ lynx mail.ru -dump
Представь себе, могут. Про данные утилиты мне известно, хотелось сделать именно проверку порта через nmap. Мой вопрос был исключительно по синтаксису, и то - я уже жалею, что его задал.
>Мой вопрос был исключительно по синтаксису, и то
> - я уже жалею, что его задал.Проанализируй вывод
man bash|wc
и скажи дяде "спасибо". Он страдал, увидев твой "синтаксис".
>>Мой вопрос был исключительно по синтаксису, и то
>> - я уже жалею, что его задал.
> Проанализируй вывод
> man bash|wc
> и скажи дяде "спасибо". Он страдал, увидев твой "синтаксис".Спасибо. Я думаю, что это был мой второй и последний вопрос на данном форуме. Дабы не заставлять никого страдать.
> Спасибо. Я думаю, что это был мой второй и последний вопрос на
> данном форуме. Дабы не заставлять никого страдать.2All оставшимся: Что-то не ладно в Форуме! Мы теряем не первую выпускницу института девиц (ой. не сексизм, нет-нет!). Надо же что-то менять.
> Представь себе, могут. Про данные утилиты мне известно, хотелось сделать именно проверку
> порта через nmap.У многих заглушки висят - порт открыт, а сервис не работает.
> [[ $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
> Практика "[[ условие ]] && команда1 || команда2" _не рекомендуется_ многими.
> И твой код - собственно пример, почему.
>...Благодарю за комментарий. Через if-else сделал сразу, потом захотелось попробовать написать с использованием логических операторов. Это просто попытки решить одну задачу разными способами.