Rechnen in Shell-Scripten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Rechnen in Shell-Scripten

Beitrag von Maui Muc » 05.11.2005 12:19:11

Hallo,

ich möchte in einem Shell-Script die Wurzel (nur 2te) aus einer Zahl ziehen. Außerdem würde ich auch gerne mit Nachkommastellen arbeiten können.

z. B. sqrt5 * 2.35 ~ 5.25476

Wie mache ich das?

Wichtig wäre mir auch, dass das Script auf möglichst vielen Shells lauffähig ist. (Also keine Spezialpakete o.ä.)

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 05.11.2005 13:21:06

Ich würde dafür bc verwenden, also ungefähr so

Code: Alles auswählen

#!/bin/sh
x=`bc << EOF
scale = 6
sqrt(5) * 2.35
EOF
`
echo $x
MfG GoKi
:wq

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 05.11.2005 13:28:18

Ich bezweifle, dass die Shells in dem Bereich wirklich soviel koennen.
Ohne zusaetzliche Tools wie z.B. bc wird das wohl nix werden.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Re: Rechnen in Shell-Scripten

Beitrag von Joghurt » 05.11.2005 13:50:57

Maui Muc hat geschrieben:ich möchte in einem Shell-Script die Wurzel (nur 2te) aus einer Zahl ziehen. Außerdem würde ich auch gerne mit Nachkommastellen arbeiten können.
OK, ohne Nachkommastellen hätte man da etwas machen können, mit Nachkommastellen geht ohne Hilfsprogramme wie dc oder bc nicht, da die Shells nur mit Ganzzahlen umgehen können.

PS: Bevor jemand fragt, Wurzel aus x kann man mit

Code: Alles auswählen

W[n+1] = (W[n] + (x/W[n])) / 2
berechnen. Für W[0] einen beliebigen Startwert nehmen und solange iterieren, bis abs(X[n+1]-X[n]) kleiner oder gleich der gewünschten Genauigkeit ist, bei Ganzzahlen also 1 (manchmal springt der Wert bei Ganzzahlen zwischen a und a+1 hin und her)

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Re: Rechnen in Shell-Scripten

Beitrag von Maui Muc » 05.11.2005 14:49:07

Joghurt hat geschrieben: ...

Code: Alles auswählen

W[n+1] = (W[n] + (x/W[n])) / 2
...
jetzt wo du es sagst, fällt mir ein dass ich das mal beweisen musste. :(

Sind dc und bc weit verbreitet? Oder muss ich die Pakete in der Regel erst einspielen. Dem User des Scripts sollten möglichst wenige Stolpersteine in den Weg gelegt werden.

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 05.11.2005 17:55:05

Hm, muss es denn unbebdingt ein Shell-Skript sein?
Eventuell waere Perl die bessere Wahl, das kann in der Hinsicht mehr und is eigentlich auch ueberall installiert.

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 05.11.2005 18:28:58

zsh kann floating point Operationen.
POSIX ist das aber nicht.

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 05.11.2005 19:13:35

Es ist einfach so, dass ich gerade mal halbwegs vernünftig mit der Shell zurecht komme. Ein Script schreiben und gleichzeitig ein Programmiersprache lernen ist wohl etwas viel. Zudem ist das Script schon fast fertig.

Auf eine andere Shell umsteigen will ich eigentlich auch nicht die bash tuts eigentlich.

Ich werde mich mit bc begnügen, auch wenn es nicht gerade stilistisch schön ist. Für meine Zwecke wird es schon reichen.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 05.11.2005 19:15:32

Für was für eine Art von Skript braucht man denn die Quadratwurzel?

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 05.11.2005 23:47:07

Ich bastle hier an einem Script, um Bilder von einer Internetseite zu laden, und die sind in einem Quadrat angeordnet.

Mit bc klappe wunderbar. Ist das ein Paket oder in der Regel bei jeder aktuellen Shell dabei?

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 06.11.2005 00:43:54

eine Frage hätte ich noch, zwar nicht ganz zum Thema passend aber sicher schnell beantwortet.

Wie kann ich prüfen ob bc vorhanden ist?

ich habe es mit

Code: Alles auswählen

if [-f"bc"]
then
..
else
...
fi
versucht, das klappte leider nicht.

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 06.11.2005 00:50:47

Code: Alles auswählen

if [ -x `which bc 2>/dev/null` ]; then
    yada yada
fi
Sollte ganz gut funktionieren.

-Flo

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 06.11.2005 11:11:17

was bewirkt 2>/dev/null?[/quote]

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 06.11.2005 11:48:07

Alle Fehlermeldungen werden auf /dev/null umgeleitet, sprich, in die grosse Muelltonne.
Damit werden die nicht in der Konsole angezeigt.

Maui Muc
Beiträge: 71
Registriert: 17.09.2004 11:10:55

Beitrag von Maui Muc » 06.11.2005 12:46:00

ah, verstehe, ">" um die stdout umzuleiten und "2>" um die Fehlerausgabe umzuleiten

Vielen Dank

lemonstar
Beiträge: 74
Registriert: 02.11.2003 20:55:20

Beitrag von lemonstar » 17.11.2005 11:27:22

Kommt man irgendwie an die ASCII Werte von chars ran?

lemonstar
Beiträge: 74
Registriert: 02.11.2003 20:55:20

Beitrag von lemonstar » 18.11.2005 19:24:36

Mit

Code: Alles auswählen

echo -n $ch | xxd | awk '{print $2}'
kommt man schonmal an den ASCII Code in Hex. Gibt es eine einfache Möglichkeit das zum Rechnen nach dezimal zu wandeln?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 18.11.2005 20:12:36

Du kannst natürlich perl dafür benutzen

Code: Alles auswählen

perl -e "print ord('$ch')"
aber vielleicht solltest du dann eh auf perl (oder python) wechseln.

cosmac
Beiträge: 4573
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 18.11.2005 20:27:46

aber zur Not geht's auch in der Shell:

Code: Alles auswählen

echo -n $CH | od -A n -i
Beware of programmers who carry screwdrivers.

Antworten