синтаксическая ошибка: неверный арифметический оператор (ошибка маркер является "")

Я пытаюсь написать функцию, которая проверяет текстовый файл, строка за строкой, проверяя каждое поле определенными критериями, а затем суммирует все это. Я использую точно такой же способ суммирования каждого из cretirias, но для 4-го (в коде это будет время) я получаю ошибку в названии. Я попытался удалить строку, которая суммирует время, и мой код работал просто отлично, я понятия не имею, что не так с линией, и я довольно новичок в Bash. Помощь будет оценена!

здесь код:

#!/bin/bash
valid=1
sumPrice=0
sumCalories=0
veganCheck=0
sumTime=0
function checkValidrecipe
{
    while read -a line; do
        if (( ${line[1]} > 100 )); then
            let valid=0
        fi
        if (( ${line[2]} > 300 )); then
            let valid=0
        fi
        if (( ${line[3]} != 1 && ${line[3]} != 0 )); then
            let valid=0
        fi
        if (( ${line[3]} == 1)); then
            veganCheck=1
        fi
        let sumPrice+=${line[1]}
        let sumCalories+=${line[2]}
        let sumTime+=${line[4]}
    done < ""
}
checkValidrecipe ""
if (($valid == 0)); then
    echo Invalid
else
    echo Total: $sumPrice $sumCalories $veganCheck $sumTime
fi

и я могу предположить, что каждый входной файл будет иметь следующий формат:

name price calories vegancheck time

Я пытаюсь запустить скрипт с этим входным файлом:

t1 50 30 0 10
t2 10 35 0 10
t3 75 60 1 60
t4 35 31 0 100
t5 100 30 0 100

(пустая строка в комплекте)

и вот результат:

")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
Total: 270 186 1 0

большое спасибо за вашу помощь!

1 ответов


ваш входной файл содержит окончание строки CR+LF. Таким образом, переменная ${line[4]} это не число, как 10 но 10\r что вызывает ошибку.

удалить возврат каретки из входного файла с помощью такого инструмента, как dos2unix.

кроме того, вы можете изменить свой скрипт для его обработки, изменив

done < ""

to

done < <(tr -d '\r' < "")