Archiv verlassen und diese Seite im Standarddesign anzeigen : Scriptfrage!
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
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.
habs versucht aber wenn ich mal 1000 macht schreibt er einfach 3000 rein.Wat is da los??
MFG
Maruu
dann versuch's mal VOR der division:
1000*90/28
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
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
perl ist latürnich die bessere wahl :rolleyes:
x ** y heist x hoch y.
und x hoch 1/2 ist bekanntlich die Wurzel von x
:-)
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
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
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
Danke hat mir schon sehr weitergeholfen.
MFG
Maruu
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
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.
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 ;)
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
Kapitel 3.14 vom 3. das in meiner Signatur
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.