LINUX.ORG.RU

bash скрипт с множественными условиями

 


0

1

Уважаемые, подскажите как на bash написать скрипт с условиями. Есть датчик температуры в помещении. С него кроном 1 раз в час снимаются показания и в зависимости от температуры и месяца в году нужно принять решение отправлять сообщение на почту или нет. Т.е. если месяц меньше 5 и больше 10(условно зима) и температура ниже 16 и выше 22 отправить сообщение. Иначе если месяц больше 5 и меньше 10(условно лето) и температура меньше 14 и больше 30 отправить почту. Написал такой кусок кода:


#!/bin/sh

m=11
t=18

if [[ $t -lt 16 ]] || [[ $t -ge 22 ]] && [[ $m -lt 5 ]] || [[ $m -gt 10 ]]; then
echo "Зима, всё плохо шлем сообщение"
else
echo "Выполнить скрипт в летнем диапазоне"
fi

Если это выполнить в консоли то он вернет

/opt/home # ./test1.sh
Зима, всё плохо шлем сообщение

Переменная «m» - номер месяца в году, а «t» - температура. Хотя месяц у нас «зимний» и температура в «нормальном» диапазоне. Если это нереально на bash сделать, то подскажите в каком направлении копать. В программировании не силён.

Сейчас у меня есть рабочий скрипт, но он проверяет только одно условие:

if [[ $temp -le $tmin ]] || [[ $temp -ge $tmax ]]; then

Так что ли?

#!/bin/sh

m=11
t=18

if ( [ $t -lt 16 ] || [ $t -ge 22 ] ) && ( [ $m -lt 5 ] || [ $m -gt 10 ] ) ; then
echo "Зима, всё плохо шлем сообщение"
else
echo "Выполнить скрипт в летнем диапазоне"
fi
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)

У тебя все условия, что разделены знаками || и &&, проверяются последовательно согласно логике этих знаков:

  • x || y... – Если x, тогда x, иначе проверяем y...
  • x && y... – Если не x, тогда не x, иначе проверяем y...

Ставь скобки, и можешь писать условия любой длины.

wandrien ★★
()

Если это нереально на bash сделать, то подскажите в каком направлении копать.

это реально на баше сделать. но лучше погуглить питона, ибо на нем это выглядит куда лучше. башевские иероглифы сложно понять.

mamkin_kakir
()

Дату проверяйте через стандартный механизм, например парся вывод

date
Для обработки события сделайте функцию, например
temperature () {
if [ "$actual_temp" -ne "$critical_temp" ]; then
temperature=0
else
#echo "Temperature normally"
temperature=1
fi
}
где $critical_temp какой-нибудь диапазон (массив чисел например) По аналогии функцию для проверки даты, хотя можно элегантнее.

И потом

if [ "$temperature" -ne 0 ] and [ "$date" != "$season" ]; then
ACTION
...
fi

В конце добавляйте условий, я думаю сумбурно, но смысл передал

Aborigen1020
()
Ответ на: комментарий от Aborigen1020

Всем спасибо. Вот, что у меня получилось:

#!/bin/sh

PATH=/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


# Летняя температура
tmins=10
tmaxs=30

# Зимняя температура
tminw=14
tmaxw=23

# Оперделим месяц и запишем в переменную
month=`date +"%m-%d-%Y" | awk -F "-" {'print $2'}`
month=${month}

# Получим значение температуры и запишем в переменную
temp=`digitemp_DS9097 -q -a -o "%.0C" -c /opt/etc/digitemp.conf`
temp=${temp}

# Проверка условий "Зима"
if ( [ $temp -le $tminw  ] || [ $temp -ge $tmaxw ] ) && ( [ $month -le 4 ] || [ $month -ge 10 ] ); then
echo -e "Subject:Warning temperature\r\n\r\nTemperature $temp C " |msmtp --from=default -t mail@-----.ru
else
# Проверка условий "Лето"
if ( [ $temp -le $tmins ] || [ $temp -ge $tmaxs ] ) && ( [ $month -ge 5 ] || [ $month -le 9 ] ); then
echo -e "Subject:Warning temperature\r\n\r\nTemperature $temp C " |msmtp --from=default -t mail@-----.ru
else
exit 0
fi
fi

Вполне читабельно. Если кому-то не лень могут в другом варианте запостить. Для меня главное оно заработало.

bredis
() автор топика
Ответ на: комментарий от bredis

month=`date +«%m-%d-%Y» | awk -F "-" {'print $2'}`

Вы сделали мой вечер. Во-первых, это день, во-вторых, вы не поверите, но формат для date для того и придуман, чтобы выводить именно то, что вам надо:

month=$(date "+%m")

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Можно и так, но это уже чистый башизм. Так что вас не поймёшь, если уж писать на bash, то весь топик надо в мусор отправлять, с [ ... ] && [ ... ] || вместо нормальных [[ ... && ... ]] и скобочками.

vodz ★★★★★
()
Ответ на: комментарий от bredis
# Летняя температура
tmins=10
tmaxs=30

# Зимняя температура
tminw=14
tmaxw=23

# Оперделим месяц и запишем в переменную
month=`date +"%m"`

# Получим значение температуры и запишем в переменную
temp=`digitemp_DS9097 -q -a -o "%.0C" -c /opt/etc/digitemp.conf`

if [ $month -ge 5 -a $month -le 9 ]; then
  # summer
  tmin=$tmins
  tmax=$tmaxs
else
  # winter
  tmin=$tminw
  tmax=$tmaxw
fi

if [ $temp -le $tmin -o $temp -ge $tmax ]; then
  echo -e "Subject:Warning temperature\r\n\r\nTemperature $temp C " |msmtp --from=default -t mail@-----.ru
fi
futurama ★★★★★
()
Ответ на: комментарий от bredis

А так, что тут скажешь

Велосипеды, это когда сам изобретаешь то, что уже есть и лучше, а костыль — это когда задача решается кривыми и не теми способами. Ничего это не подходит к вашему:

temp=${temp}

vodz ★★★★★
()
Ответ на: комментарий от futurama

Элегантно и просто. А у меня будто топором рубили. А научиться хочется.

bredis
() автор топика
Последнее исправление: bredis (всего исправлений: 1)

lockrun не забудь в crontab. Иначе огребешь по полной..

Bootmen ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.