2010-06-26 22 views
5

Mam pewne problemy ze skryptami ... jeśli ktoś mógłby mi pomóc, byłoby naprawdę dobrze!Arytmetyczny problem ze skryptem powłoki

Mój skrypt posiada:

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

A ja dostaję ten błąd:

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

Czy ktoś może mi pomóc?

Myślę, że to dlatego, że bash działa tylko z liczbą całkowitą ... Muszę jednak użyć wartości zmiennoprzecinkowych.

góry dzięki


Problem rozwiązany:

WIZYTY = $ (echo $ WR + $ RD | bc); echo $ WIZYTY

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

Odpowiedz

5

Można użyć bc robić swoje obliczeń zmiennoprzecinkowych, czyli

echo $WR + $RD | bc 

i tak dalej.

+0

HUm ... to działa na sumę, to nie działa dobrze dla mnożenia. To dziwne, ponieważ sprawdziłem instrukcję bc i powinno działać! Zobacz: Mój skrypt: echo $ WR + $ RD | bc &> WIZYTY; WIZYTY = $ (echo $ WR + $ RD | bc); # działa dobrze echo $ WIZYTY SERVICE_DEMAND = $ (echo $ WIZJE * USD SERWIS_ZAK. | bc); # Powrócić dziwny błąd echo $ SERVICE_DEMAND Błąd: 0,0895406 3,42007 12,401 3,5096106 (standard_in) 1: błąd składni (standard_in) 1: nielegalny charakter: K (standard_in) 1: nielegalny charakter: H (standard_in) 1: niedozwolony znak: T ... – Alucard

+0

@user: Ponieważ '*' ma specjalne znaczenie dla powłoki, musisz napisać '\\ *' lub ''*''. Należy również bezpośrednio przypisać wynik obliczenia do zmiennej zamiast do pliku: 'VISITS = $ (echo $ WR + $ RD | bc)'. –

+0

@ user368453: Jeśli wykonasz "echo" z '*', wyświetli on wszystkie nazwy plików w bieżącym katalogu. Wystarczy umieścić cytaty na formularzu i będzie działać: 'SERVICE_DEMAND = $ (echo" $ VISITS * $ SERVICE_DEMAND "| bc)' –

1

Będziesz musiał użyć zewnętrznego programu, takiego jak bc, do wykonywania matematyki zmiennoprzecinkowej w swoich skryptach.

Coś jak:

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

2

Aby ustawić precyzję (ilość cyfr w odpowiedzi na prawo od kropki dziesiętnej), zapisu:

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 

This wyjścia:

Service Demand = 1.0744872 

The skala = 5 ustawia 5 cyfr precyzji; kopie wtórne powodują, że wyrażone wyrażenie ma wartość , a ouput (z bc -l) zostanie przypisane do zmiennej.

+0

Dzięki Ale ... on zwrócony następujący błąd: (standard_in) 2: błąd składni – Alucard

+0

ja po prostu zabrakło tego ponownie na GNU bash, wersja 4.0.35 (1) -release (i586-suse -linux-gnu) –

+0

Alucard, być może twój cut-and-pasting wprowadził \ r \ n. Wypróbuj dos2unix scriptname na swojej kopii. –

3

Zamiast używać , należy rozważyć przejście na lepszy język programowania. Bash jest po prostu nieodpowiedni do matematyki.

Powiązane problemy