PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scriptfrage!



Maruu
02-09-2002, 11:45
Hallo!

Ich hab folgendes Script erstellt:

sollzeit=$((90/28))
echo $sollzeit > /scripte/internet/status/auslastung/auslastung.log

In die Datei schreibt er 3 anstatt einem genauen Wert 3,xxx wie bekomm ich das genauer hin??

MFG

Maruu

elrond
02-09-2002, 12:08
es sieht so aus, als würden die letzten stellen abgeschnitten und nur ein integer geschrieben werden.
versuch doch mal sollzeit=$((90/28*1000)) . bei der Ausgabe musst du dann halt zurückrechnen.

Maruu
02-09-2002, 12:52
habs versucht aber wenn ich mal 1000 macht schreibt er einfach 3000 rein.Wat is da los??

MFG

Maruu

elrond
02-09-2002, 13:20
dann versuch's mal VOR der division:

1000*90/28

fork
02-09-2002, 21:06
Perl, der Kommandozeilen - Taschenrechner



x=3
y=11
z=7
echo $(perl -e "print (($x ** $z / $y) ** (1/2))")

Zu Deutsch: (x hoch z) durch y und von dem ganzen die Quadratwurzel

Maruu
03-09-2002, 10:04
cool hats da rigendwo ne Anleitung dazu???
Weil was Wurzel und so ist sollte ich nachlesen können
**(1/2) usw. meine ich

MFG

Maruu

elrond
03-09-2002, 14:40
perl ist latürnich die bessere wahl :rolleyes:

fork
03-09-2002, 16:31
x ** y heist x hoch y.

und x hoch 1/2 ist bekanntlich die Wurzel von x
:-)

tomes
03-09-2002, 17:48
voellig ideotisch, aber Division in der Bash ;-)))

#!/bin/sh
i=0

((a=$1/$2))
((b=$1%$2))
echo $a"," > /tmp/erste
cp /dev/null /tmp/zweite

while (( $i < $3 )); do

((b*=10))
((a=$b/$2))
((b=$b%$2))

z=`more /tmp/zweite`
rm /tmp/zweite
echo $z$a >> /tmp/zweite

x=$b
((i=i+1))

done

aaa=`more /tmp/zweite`
bbb=`more /tmp/erste`
echo $bbb$aaa
rm /tmp/erste
rm /tmp/zweite
Da kann man dann auch sagen, auf wieviel Stellen genau ($3) ;) ;) ;)

T;o)Mes

Maruu
03-09-2002, 21:05
Hallo!

Ist ja gut das es doch geht nur mit dem Quelltext komm ich ned ganz zu recht. Kannst du noch Kommentare dazu machen??? Vor allem wo ist der unterschied zwischen 3/4 und 3%4???

MFG

Maruu

tomes
04-09-2002, 14:45
Sollte eigendlich nur ein Spass sein, aber wenn du es benutzen moechtest, bitte ;-)
Das ganze *funct* wie ein Division auf dem Papier.

Also der Unterschied zwischen / und % ist der, dass der eine
dividiert --> /
der andere
den REST der Divsion ermittelt --> %

Was der REST einer Division ist weist du hoffentlich.
90 / 28 = 3, REST 6 (3 * 28 = 84, 90 - 84 = 6)

- dann muss man nur wie auf dem Papier --> REST und eine Null rann ( jetzt kommen die Stellen nach dem Komma), also REST * 10
- Und dann geht der Spass in der Schleife solange wie i kleiner ist als $3 ((i=$i+1))
wie auf dem Papier ;-)
- Man koennte auch eine Abfrage stellen, ob der REST == 0 ist, um dann die Schleife zu verlassen ;-), aber war ja nur ein Spass, ausserdem kann man so die Stellen hinter dem Komma direkt bestimmen. ( koennte man auch anders, ich weiss, aber s.o.)

- Der ganze "Schwanz" mit den Hilfs-Files ist nur fuer eine formatierte Ausgabe.
- cp /dev/null /tmp/zweite --> erzeugen einer neuen Datei ( Ich weiss die meisten missbrauchen touch dafuer)
- z=`more /tmp/zweite` --> lese was bisher ermittelt wurde in z
- dann loesche das File
- echo $z$a >> /tmp/zweite --> schreibe z und die neue Zahl in das File
- Den ganzen Rest muesstest du verstehen ;-)

T;o)Mes

Maruu
05-09-2002, 07:07
Danke hat mir schon sehr weitergeholfen.

MFG

Maruu

tomes
05-09-2002, 12:25
Wenn du es richtig machen willst, sieh dir mal an was fork gepostet hat.
Perl ist nicht jedermanns Sache, aber um vieles staerker als die Bash.
Beides kombinieren kann man eben auch.
Beispiel:
#!/bin/sh
a=90
b=28

echo $(perl -e "print ( $a / $b );")
--------------------------------------
Das sind nur 4 Zeilen, im Gegensatz zur Division in der Bash --> ueber 20

Fazit:
Immer die richtige "Script"-Sprache fuer ein *prob* benutzen. ;) ;) ;)

T;o)Mes

fork
06-09-2002, 13:28
Immer die richtige "Script"-Sprache fuer ein *prob* benutzen.

Perl ist für Faule, denn wer Perl kann, muss eigentlich keine andere (Skript-)Sprachen lernen(sofern man nicht gezwungen ist vorhandene Programme in anderen Sprachen zu warten), da damit fast alles geht. Ausserdem ist Perl plattformübergreifend verfügbar -> noch besser für Faulenzer, da man sich nicht mit VBx & Windows-Batch rumärgern muss.

Auch in Unix-derivaten sind Shellscripte nicht 100%-ig kompatibel was z. B. die Ausgabe im Zusammenhang mit Ansi-Escape-Sequenzen(->echo-Befehl+Schalter) betrifft, mal abgesehen davon das viele Kommandos leichte Unterschiede aufweisen was Name und Schalter betrifft.

tomes
06-09-2002, 20:18
Ich komme nun mal aus der C/C++ Schule und da faellt einem Perl immer erst zu Schluss ein. ;) ;) ;)
Muss mich mal langsam mehr damit beschaeftigen.

T;o)Mes

P.S.: Aber ist doch ein lustiges Beispiel --> Division in der Bash
was man so alles machen kann, wenn man nur einwenig von dem ganzen Beherrscht
:p
Schleifen sind Schleifen ;)

Maruu
09-09-2002, 21:50
hallo

weiteres Problem nachdem / und * und so ging muss ich jetzt vergleichen da die Shell anscheinend diesen Code nicht kann:

if [ $ausgleichszeit < 0 ]; then
echo zu viel gesurft
else
echo zu wenig gesurft
fi


wobei in $ausgleichszeit ein wert wie 3.6654654 steht und die Shell dann immer zu viel gesurft ausgibt. Geht das auch in Perl oder mach ich in der Shell nen Fehler??

MFG

Maruu

fork
09-09-2002, 22:05
Kapitel 3.14 vom 3. das in meiner Signatur

Maruu
10-09-2002, 06:28
Danke erstmal hab mal nachgeschaut aber nur Ganzzahlvergleiche gefunden ich hab aber Komma Werte also Integer, wie kann ich die vergleichen es sollte auf ein Paar Stellen nach dem Komma gleich sein.

MFG

Maruu

neat neat neat
11-09-2002, 11:13
Andere Variante: "bc"
Ist nach meiner Methode aber recht umständlich und geht sicher eleganter, nur bin ich jetzt selbst zu faul in die manpage zu gucken:
In Dein Shellskript muss ein
export BC_ENV_ARGS=bc_args, damit "bc" weiss, dass es seine Variablen in "bc_args" findet.

echo "bc_ausgleichszeit = $ausgleichszeit">bc_args
echo "bc_vergleichszeit = 0">> bc_args
Schreibt Deine Shell-Variablen nach "bc_args"

Dann legst Du eine Datei vergleich.bc an:
if (bc_ausgleichszeit > bc_vergleichszeit) {
print "Zu viel gesurft \n"
}
quit
Satt der Variable bc_vergleichszeit könntest Du (falls das noch aktuell ist) natürlich auch direkt 0 angeben.

Aus dem Shellskript aufgerufen wird das bc-Konstrukt mit
bc -q vergleich.bc

Flüchtig getestet, scheint zu funktionieren.