Rechnen unter der Bourne Shell ?

Post Reply
Message
Author
tuxic trace

Rechnen unter der Bourne Shell ?

#1 Post by tuxic trace »

Ist es möglich, unter sh (nicht bash) zu subtrahieren ?

ich denke da an sowas wie

a=20
let ${a}-=4

obiges klappt nun nicht, da rein bash, aber vielleicht gibt es ja bourne-equivalent oder eine andere Möglichkeit.

Jochen

Re: Rechnen unter der Bourne Shell ?

#2 Post by Jochen »

In der alten Bourne-Shell gibt es nur eine Möglichkeit zu rechnen: expr(1)

Und da expr(1) nun mal ein externen Programm ist, wird ein Bourne-Shell-Skript, das viel rechnen muss, sicherlich kein Renner werden... Aber so geht es:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
VAR=20
VAR=`expr "$VAR" - 4`
</font><hr></pre></blockquote>
Zur Beachtung:
<li>Nicht die Blanks um den Operator vergessen.
<li>Bei Multiplikation nicht vergessen, den Stern zu entwerten (Dateinamensgenerierung!).
<li>Nur Integer-Rechnung.
<li>Nur Addition "+", Subtraktion "-", Multiplikation "\<!--no-->*", Division "/" und Modulo "%".

Wenn Du die bash nicht zur Verfügung hast, schau mal nach, ob Du nicht die Kornshell (ksh) im Zugriff hast. Die kann intern rechnen und Variablen auch direkt im Integerformat speichern, was die Skripte gut beschleunigt. Aus eigener Erfahrung: Ich habe mal die Türme von Hanoi als Bourne-Shellskript mit rekursivem Aufruf, Bourne-Shellskript unter Verwendung von Funktionen und Kornshellskript unter Verwendung von Funktionen. Auf einer alten Kiste dauerte die Lösung des Problems mit 8 Scheiben bei den beiden Bourneshell-Varianten ca. 45 Sekunden, die Kornshell-Lösung 1 Sekunde...

Jochen

tuxic trace

Re: Rechnen unter der Bourne Shell ?

#3 Post by tuxic trace »

ksh ist da, aber nicht unter /bin. Ich bin immer noch (oder wieder) bei meinem init-umschreiben und wollte von bash auf ash umsteigen (oder gibt es/kennst Du eine andere OSS bourne shell ?) - alerdings ohne auf das schöne "[ ok ]" bei den Diensten zu verzichten :) Ich muß also nur einmal von der Bildschirmbreite ein paar Zeichen abziehen, da wird expr wohl tun.


Mit einer virtuellen Verbeugung wie immer tausend Dank.

Jochen

Re: Rechnen unter der Bourne Shell ?

#4 Post by Jochen »

ash? Das ist was anderes. Aus der man-Page zu ash:<blockquote><hr>

Arithmetic expansion provides a mechanism for evaluating an arithmetic
expression and substituting its value. The format for arithmetic expan-
sion is as follows:

$((expression))

The expression is treated as if it were in double-quotes, except that a
double-quote inside the expression is not treated specially. The shell
expands all tokens in the expression for parameter expansion, command
substitution, and quote removal.

Next, the shell treats this as an arithmetic expression and substitutes
the value of the expression.<hr></blockquote>

Also einfach <blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
VAR=20
VAR=$(( $VAR - 4 ))
</font><hr></pre></blockquote>

Wenn Du vielleicht doch bei der bash bleiben willst: Da gibt es "printf" als eingebaute Shell-Funktion, die das gleiche macht wie in C. Wenn man also einen Text ohne Newline in strikt 60 Zeichen Breite, aufgefüllt mit Blanks haben will, braucht man nur

printf "%-60s" "Dienst x:"

verwenden. Gibt es auch als Stand-Alone Binary unter /usr/bin.

Jochen

Rossi

Re: Rechnen unter der Bourne Shell ?

#5 Post by Rossi »

Ich war der Meinung, die ash sei eine freie "bug for bug" Reimplemenierung der bourne shell ... hab ich wohl was falsches gelesen.

Wenn dem nicht so ist, würde es aber erklären, warum mein Rechner nicht mehr hochfährt, wenn ich "ln -f ash sh" mache - das erste rc-Skript ist recht simpel und sollte eigentlich sh kompatibel sein.

Jochen

Re: Rechnen unter der Bourne Shell ?

#6 Post by Jochen »

Nein, die ash will zwar abwärtskompatibel zur Bourne-Shell sein, hat aber ein paar Erweiterungen, wie z.B. die Tilde-Expansion ("cd ~user" um ins Home-Directory von user zu kommen), die o.a. Arithmetic Expansion, Aliases, lokale Variable in Funktionen und noch ein paar Kleinigkeiten mehr.

Wenn das Skript aber schon Bourne-Shell-kompatibel ist, dürfte ash damit keine Schwierigkeiten haben, ausser wenn ein sehr spezieller Falle eintritt. Wenn das Skript eher einfach ist, liegt die Fehlerursache vielleicht woanders. Startet das Skript überhaupt korrekt auf, oder streckt schon direkt die Shell die Beine? Ggf. findet er eine benötigte Bibliothek zur Boot-Zeit nicht (unter /usr/lib, was noch nicht gemountet ist?) Das einfachste ist ein Check mittels "ldd /bin/ash" oder indem Du die ash statisch übersetzt.

Jochen

Post Reply