У меня есть простой IRC-бот, написанный на Bash.Он использует внешний клиент CLI IRC (ii) и просто читает новые сообщения, которые отправляются на канал из файла, выполняет небольшое форматирование для них, проверяет, совпадают ли они с чем-либо, и, если они это делают, пишет вфайл.Stdout скрипта перенаправляется в файл «out», который читается через ii (если у бота есть, что сказать в канале).
Основная функция скрипта - проверить, является ли сообщениехранится в переменной $msg
и соответствует предопределенной строке.Если это так, он вызывает функцию для добавления значения (точек) в текстовый файл с определенным форматом.
Вот код:
#!/bin/bash
$points_file="$HOME/points"
$channel="#testchan"
tail -f -n 0 ~/irc/someirc.network.com/$channel/out | \
while read -r time nick msg; do
nick=${nick#"<"}
nick=${nick%">"}
function manage_points () {
points=$(grep -w $nick $points_file | cut -d% -f2)
gnu_times=$(grep -w $nick $points_file | cut -d% -f3)
linux_times=$(grep -w $nick $points_file | cut -d% -f4)
: ${gnu_times:="0"}
: ${linux_times:="0"}
if [ "$1" -eq 1 ]; then
new_points=$(($points + $2))
gnu_times=$(($gnu_times + 1))
elif [ "$1" -eq 0 ]; then
new_points=$(($points-$2))
linux_times=$(($linux_times+1))
fi
if [ ! -z "$points" ]; then
sed -i "s/.*$nick.*/$nick%$new_points%$gnu_times%$linux_times/" $points_file
else
#baby's first point
echo "$nick%$new_points%$gnu_times%$linux_times" >> $points_file
fi
}
if [[ $msg == *"GNU/Linux"* ]] && [[ ! $msg == "!"* ]]; then
check_last_nick "$nick" || continue
manage_points "1" "1"
elif [[ $msg == *"Linux"* ]] && [[ ! $msg == "!"* ]]; then
check_last_nick "$nick" || continue
if [[ $msg == *"Linux kernel"* ]] && [[ ! $msg == "!"* ]]; then
continue
fi
manage_points "0" "1"
done > in
В этом случае *Файл 1009 * выглядит примерно так:
user1%19%21%2
user2%21%21%0
user3%10%11%1
user4%-3%0%3
Однако по какой-то причине скрипт время от времени умирает (не всегда) со следующей ошибкой:
/home/bot.sh: line 47: 21
21 + 1: syntax error in expression (error token is "21 + 1")
Строка47 в исходном коде:
new_points=$(($points + $2))
Странная вещь в том, что он умирает каждый раз, когда ему нужно выполнить это точное уравнение, 21 + 1, то есть у пользователя уже есть значение 21, которое читаетсяиз текстового файла и поместите в переменную $points
, и мы добавляем еще 1 очко.
Я понятия не имею, что может быть причиной этого, и я пробовал разные вещи, такие как игра с пробелами (например, $points+$2
вместо $points + 2
), используя различные комбинации expr
, $(())
, (())
и т. д.).В файле points
нет странных символов.