2010-06-26 2 views
5

У меня есть некоторые проблемы при написании сценариев ... если кто-то может мне помочь, это было бы очень хорошо!Арифметическая проблема со сценарием оболочки

Мой скрипт:

VISITS=$((WR + RD)); 
SERVICE_DEMAND=$((VISITS*SERVICE_DEMAND)); 

И я получаю эту ошибку:

./calc_serv_demand.sh: line 12: 0.0895406: syntax error: invalid arithmetic operator (error token is ".0895406")

Может кто-нибудь мне помочь?

Я думаю, что это потому, что bash работает только с целым числом ... Мне нужно использовать значения float.

заранее спасибо


Проблема решена:

ПОЕЗДКИ = $ (эхо $ WR + $ RD | Ьс); echo $ VISITS

SERVICE_DEMAND = $ (echo $ VISITS '*' $ SERVICE_TIME | bc); echo $ SERVICE_DEMAND

ответ

5

Вы можете использовать bc сделать ваши вычисления с плавающей точкой, т.е.

echo $WR + $RD | bc 

и так далее.

+0

HUm ... он работает на сумму, это не работает хорошо для умножения. Странно, потому что я проверил на bc manual, и он должен работать! Посмотрите: Мой скрипт: echo $ WR + $ RD | bc &> ПОСЕЩЕНИЯ; VISITS = $ (echo $ WR + $ RD | bc); # отлично работает echo $ VISITS SERVICE_DEMAND = $ (echo $ VISITS * $ SERVICE_TIME | bc); # Возвращает странные ошибки эхо $ SERVICE_DEMAND Ошибка: 0,0895406 3,42007 12,401 3,5096106 (standard_in) 1: ошибка синтаксиса (standard_in) 1: недопустимый символ: K (standard_in) 1: недопустимый символ: H (standard_in) 1: незаконный символ: T ... – Alucard

+0

@user: Поскольку '*' имеет особое значение для оболочки, вы должны написать либо '\\ *', либо '' * ''. Кроме того, вы должны прямо присваивать результат вычисления переменной вместо вывода в файл: 'VISITS = $ (echo $ WR + $ RD | bc)'. –

+0

@ user368453: Если вы выполняете 'echo'' '', он отображает все имена файлов в текущем каталоге. Просто поместите цитаты вокруг формулы, и она будет работать: 'SERVICE_DEMAND = $ (echo" $ VISITS * $ SERVICE_DEMAND "| bc)' –

1

Вы должны использовать внешнюю программу, такую ​​как bc, чтобы выполнять математику с плавающей запятой в своих сценариях.

Что-то вроде:

echo ($WR+$RD)*$SERVICE_DEMAND | bc

2

Чтобы установить точность (количество цифр ответа справа от десятичной точки), записи:

WR=5 
RD=7 
VISITS=$[WR+RD] 
SERVICE_DEMAND=.0895406 
SERVICE_DEMAND=`echo "scale=5; $VISITS * $SERVICE_DEMAND" |bc -l` 
echo Service Demand = $SERVICE_DEMAND 

Этот выход:

Service Demand = 1.0744872 

шкала = 5 устанавливает 5 цифр точности; обратные отсчеты вызывают, что содержащееся выражение должно быть оценено , а вывод (от bc -l) назначен вашей переменной.

+0

Благодаря Но ... Он возвратил следующую ошибку: (standard_in) 2: ошибка синтаксиса – Alucard

+0

Я просто это снова побежал на GNU Баш, версия 4.0.35 (1) -release (i586-SuSe -linux-gnu) –

+0

Алукард, Возможно, ваш вырез и вставка ввели. Попробуйте dos2unix scriptname на вашей копии. –

3

Вместо того, чтобы использовать bc, рассмотрите возможность перехода на лучший язык программирования. Баш просто не подходит для математики.

Смежные вопросы