Bash не может выполнить конкретное уравнение внутри скрипта - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть простой 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 нет странных символов.

1 Ответ

0 голосов
/ 04 апреля 2019

Одна из ваших переменных в new_points=$(($points + $2)) содержит Возврат каретки .Вам нужно убрать его из переменной, прежде чем делать арифметику:

strippedPoints=${points//$'\r'}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...