синтаксическая ошибка: неверный арифметический оператор (ошибка маркер является "")
Я пытаюсь написать функцию, которая проверяет текстовый файл, строка за строкой, проверяя каждое поле определенными критериями, а затем суммирует все это. Я использую точно такой же способ суммирования каждого из 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' < "")