LINUX.ORG.RU

Как оптимизировать скрипт и избежать ошибки сегментирования?

 , ,


0

2

Есть быдлокод юного линуксоида. Незамысловатый чат-бот. Время от времени выдаёт ошибку сегментирования. Количество слов, на которые скрипт реагирует - сотни. Как оптимизировать, уважаемые гуру?

#!/bin/bash
 
while [ 1 ]
do

INDEXURL="http://blabla.com/index.php"
TARGTURL="http://blabla.com/chat.php" # Линк на чат
USRAGENT="Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
# USERNAME="Pupkin"

curl -e $INDEXURL -A "$USRAGENT" -L -b cookies.txt -c cookies.txt -o cha.html $TARGTURL &> /dev/null 
oldmsg=$(grep 'javascript' cha.html | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed '/Pupkin:/d' | head -n1 | cut -d':' -f3 | cut -c 2-) # находим самое свежее msg чата, исключая своё.
echo "$(date '+%H:%M:%S') $oldmsg"

sleep 60
curl -e $INDEXURL -A "$USRAGENT" -L -b cookies.txt -c cookies.txt -o cha.html $TARGTURL &> /dev/null 
newmsg=$(grep 'javascript' cha.html | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed '/Pupkin:/d' | head -n1 | cut -d':' -f3 | cut -c 2-) # ждём минуту, не скажет ли кто-нибудь что-нибудь
echo "$(date '+%H:%M:%S') $newmsg"
echo ""

if [[ "$oldmsg" != "$newmsg" ]] # если сказал, то
then

elif echo $newmsg | grep -i -s -q -E 'зд.ров|привет|драту|'^хай.'|хаюш'
then
pr2=("И Вам!" "Привет!" "Здрасьте!" "Приветики!")
rotv=${pr2[$RANDOM % ${#pr2[@]} ]} # рандомный ответ

elif echo $newmsg | grep -i -s -q -E 'адиос|бывай|встречи|свидания|скорого|досвидос|пока|увидимся|оставить|откланяться|вернусь'
then
bbl=("Пока!" "Увидимся!" "Берегите себя." "До свидания!" "Вы как хотите, а я остаюсь." "Гудбай!" "Пока, было приятно поболтать!")
rotv=$bbl[$RANDOM % ${#bbl[@]} ]} # рандомный ответ

############## ЕЩЁ НЕСКОЛЬКО СОТЕН 'elif - then' ##############

elif echo $newmsg | grep -i -s -q -E 'алло|алле|живой'
then
allo=("Я есть." "Да." "Я тут." "Я здесь.")
rotv=$allo[$RANDOM % ${#allo[@]} ]} # рандомный ответ

else rotv= ##### Молчу, т.к. не знаю, что сказать.
fi

echo "$(date '+%H:%M:%S') $rotv"
curl -e $INDEXURL -A "$USRAGENT" -L -b cookies.txt -c cookies.txt -F do=shout -F message="$rotv" -F s= $TARGTURL &> /dev/null # отправляем ответ

else : ##### Все молчат и я молчу.
fi

done


ЕЩЁ НЕСКОЛЬКО СОТЕН 'elif - then'

Про case мы не слышали…

r3lgar ★★★★★
()

############## ЕЩЁ НЕСКОЛЬКО СОТЕН 'elif - then' ##############


Жесть! Нет чтоб написать файл-конфиг с фразами на входе и фразами на выходе, а в скрипте просто читать этот файл.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)

Как оптимизировать скрипт и избежать ошибки сегментирования?
ЕЩЁ НЕСКОЛЬКО СОТЕН 'elif - then'

echo -n > script.sh && nano script.sh
h578b1bde ★☆
()

Как оптимизировать

подозреваю что наколенная спамилка... но можно хотя бы:

lcase_newmsg=$(printf %s "$newmsg" |awk '$0=tolower($0)')

case $lcase_newmsg in
  *зд?ров*|*привет*|*драту*|хай*|*хаюш*) .. ;;
  ...
esac

Количество слов, на которые скрипт реагирует - сотни

возможно, стоит лепить regexp побольше -> выцеплять совпадение (grep -o) -> сопоставлять (здесь может пригодиться словарь: через дерево или хэш-таблицу, в шелле разве что префиксы объединясь и делать вложенный case)

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

Перепилил на Case, визеально пошустрело и полегчало. За что большое спасибо.

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