2010-06-26 16 views
5

Ich habe einige Probleme bei der Skripterstellung ... wenn mir jemand helfen könnte, wäre es wirklich gut!Arithmetisches Problem mit Shell-Skript

Mein Skript hat:

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

Und ich diesen Fehler:

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

Kann mir jemand helfen?

Ich denke, es ist, weil die Bash nur mit Ganzzahl funktioniert ... Ich muss jedoch float-Werte verwenden.

Dank im Voraus


Problem gelöst:

VISITS = $ (echo $ WR + $ RD | bc); echo $ BESUCHE

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

Antwort

5

Sie bc verwenden können, um Fließkommaberechnungen, das heißt

echo $WR + $RD | bc 

und so weiter zu tun.

+0

HUm ... es funktioniert für die Summe, es funktioniert nicht gut für die Multiplikation. Es ist komisch, weil ich auf BC Handbuch überprüft habe und es sollte funktionieren! Schau mal: Mein Skript: echo $ WR + $ RD | bc &> BESICHTIGUNGEN; VISITS = $ (echo $ WR + $ RD | bc); # funktioniert gut echo $ VISITS SERVICE_DEMAND = $ (echo $ VISITS * $ SERVICE_TIME | bc); # Rückkehr einen seltsamen Fehlers $ SERVICE_DEMAND Fehler echo: 0,0895406 3,42007 12,401 3,5096106 (standard_in) 1: Syntaxfehler (standard_in) 1: unzulässiges Zeichen: K (standard_in) 1: unzulässiges Zeichen: H (standard_in) 1: unzulässiges Zeichen: T ... – Alucard

+0

@user: Da '*' eine spezielle Bedeutung für die Shell hat, müssen Sie entweder '\\ *' oder ''*'' schreiben. Außerdem sollten Sie das Ergebnis der Berechnung direkt einer Variablen zuweisen, anstatt sie in die Datei auszugeben: 'VISITS = $ (echo $ WR + $ RD | bc)'. –

+0

@ user368453: Wenn Sie ein 'echo' eines' * 'machen, werden alle Dateinamen im aktuellen Verzeichnis angezeigt. Setzen Sie einfach die Formel in Anführungszeichen und es wird funktionieren: 'SERVICE_DEMAND = $ (echo" $ VISITS * $ SERVICE_DEMAND "| bc)' –

1

Sie müssen ein externes Programm wie bc verwenden, um in Ihren Skripten Fließkomma-Berechnungen durchzuführen.

Etwas wie:

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

2

Um die Genauigkeit (Anzahl der Ziffern der Antwort auf die rechts vom Komma) gesetzt, schreiben:

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 

Diese Ausgänge:

Service Demand = 1.0744872 

Die scale = 5 legt 5 Stellen der Genauigkeit fest; Die Backquotes bewirken, dass der enthaltene Ausdruck ausgewertet wird und der Ausgang (von bc -l) Ihrer Variablen zugewiesen wird.

+0

Dank Aber ... Es gab die folgenden Fehler: (standard_in) 2: Syntaxfehler – Alucard

+0

Ich lief dies wieder auf GNU bash, Version 4.0.35 (1) -release (i586-suse -linux-gnu) –

+0

Alucard, Vielleicht hat Ihr Cut-and-Pasting ein \ r \ n eingeführt. Versuchen Sie dos2unix scriptname auf Ihrer Kopie. –

3

Anstatt bc zu verwenden, sollten Sie in eine bessere Programmiersprache wechseln. Bash ist einfach ungeeignet für Mathematik.