2017-02-08 6 views
0

Я пытался получить данные из файла и выполнения арифметических операцииПринимая данные из файла и выполняет сложение с помощью команды Баш

#!/bin/bash 
INPUT=menu.txt 
IFS="," 
[ ! -f $INPUT ] &while read ch ch1 menu rate quantity 
do 
echo "Choice : $ch" 
echo "Choice of menu : $ch1" 
echo "menu : $menu" 
echo "price : $rate" 
echo "quantity : $quantity" 
echo "$(($rate * $quantity))" 
done < $INPUT 

при выполнении этого кода возникает ошибка

Choice : veg
Choice of menu : soup
menu : corn soup
price : 160
quantity : 1
")syntax error: invalid arithmetic operator (error token is "

Может ли кто-нибудь помочь мне в решении этого?

+0

используйте команду подстановки «'», как –

+0

вы можете быть более ясным в письменном виде весь синтаксис я не получаю это то, что у означает –

ответ

0

Скорее всего, из-за арифметики с плавающей запятой. Я предполагаю, что переменная rate является числом с плавающей запятой. Таким образом, вам это нужно:

echo "$rate * $quantity" | bc 
+0

в последней переменной количества кнопку ввода, которую я нажал и сохранил. Как удалить это –

+0

В идеале это не так, это может выглядеть так, потому что вы используете эхо, а не printf –

0

Из этого сообщения об ошибке наизнанку, я думаю, что ваш файл menu.txt в формате DOS/Windows, а это означает, что каждая строка заканчивается символом возврата каретки и перевода строки. Инструменты Unix, такие как bash, ожидают, что строки заканчиваются только строкой (формат unix для текстовых файлов) и поэтому обрабатывают символ возврата каретки как часть строки. В вашем скрипте это означает, что переменная quantity имеет номер и символ возврата каретки, а возврат каретки означает, что это недопустимый номер и вызывает ошибку.

Существует несколько способов исправить это. Вы можете запустить dos2unix (или аналогичную программу) в файле menu.txt. Кроме того, вы также можете заставить сценарий обрезать возврат каретки; один способ сделать это - добавить возврат каретки в IFS, поэтому команда read будет обрабатывать ее как пробел и обрезать ее. BTW, было бы лучше сделать это (и присвоение «,» IFS) в качестве префикса для команды read, чтобы они только применили к этой команде и не испортили вещи в других местах:

[ ! -f $INPUT ] &while IFS=$',\r' read ch ch1 menu rate quantity 

Кроме того, этот тест выглядит обратным для меня. Вы действительно хотите запустить цикл, если входной файл не есть? Это использование & затрудняет чтение; было бы лучше использовать явное if (и дважды процитировать ссылку на переменную), как этот:

if [ -f "$INPUT" ]; then 
    while IFS=$',\r' read ch ch1 menu rate quantity; do 
     ...