while Schleife; Rechnung im Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
msmal
Beiträge: 14
Registriert: 22.11.2011 20:36:24

while Schleife; Rechnung im Skript

Beitrag von msmal » 12.01.2012 18:44:27

Hallo, hier mal zwei Fragen an die Shell-Skript Profis hier im Forum.

Einmal bräuchte ich in eine while Schleife mit Abbruchbedingung ob ein Prozess noch läuft.
Der Prozess um den es sich handelt ist dd.

Bisher habe ich folgendes:

Code: Alles auswählen

function writelog
{
while [ $(ps -a | grep $ddpid) ]
do
kill -SIGUSR1 $(pidof dd)
sleep 3
done
}

dd if=$backup_source 2>/data/logs/dd.log | gzip > $backup_path$backup_name$now.img.gz & ddpid=$!
writelog
Als Antwort bekomme ich hier die ganze Zeit:

grep [OPTION]... MUSTER [DATEI]...



Und hier das zweite Problem:

Ich will eine einfache Rechnung durchführen und das Ergebnis in eine Variable schreiben.

Code: Alles auswählen

writing_speed_without_unit_bytes=$(expr $writing_speed_without_unit*1024*1024)

Hier schreibt er in die Variable dann
25.1*1024*1024

Ich will ja aber nicht die Rechnung, sondern das Ergebnis in der Variable, was mache ich hier den falsch?

Vielen Dank schonmal im vorraus für alle Antworten.
Gruß MSmal

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: while Schleife; Rechnung im Skript

Beitrag von detix » 12.01.2012 18:59:46

Bin zwar kein Shell-Skript Profi, aber ich versuchs mal.
Funktionen in zB der bash schreibt man so:

Code: Alles auswählen

writelog () {
  while [ ...
    do ...
  ...
}
und rechnen kann man einfach so:

Code: Alles auswählen

$(($writing_speed_without_unit*1024*1024))
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: while Schleife; Rechnung im Skript

Beitrag von Cae » 12.01.2012 19:16:35

Für das obere hab' ich das anzubieten:

Code: Alles auswählen

$ while pkill -USR1 dd; do sleep 5; done
Das richtet sich an alle dds im Wirkungsbereich [1], zerlegt sich aber automatisch, wenn es keine dds mehr gibt. Der Schönheitsfehler dürfte sein, dass du mit $! nicht dd erwischst oder es nicht in die Funktion rein kommt (und dort privat neu mit leerem Inhalt definiert wird).

Unten ist anzumerken, dass expr Abstände zwischen den Operatoren braucht und IMHO nur zwei unterstützt. Debianbc wäre eine bessere Wahl, Achtung, schnippelt per default Nachkommawerte ab.

Gruß Cae

[1] oh, und alles, was sonst auf dd matcht :)
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

msmal
Beiträge: 14
Registriert: 22.11.2011 20:36:24

Re: while Schleife; Rechnung im Skript

Beitrag von msmal » 12.01.2012 19:23:33

Also was ich noch dazu sagen hätte müssen, die Variable beinhaltet eine Kommazahl. Daher bekomme ich mit deiner Methode einen Syntaxfehler.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: while Schleife; Rechnung im Skript

Beitrag von Cae » 12.01.2012 19:27:03

msmal hat geschrieben:Also was ich noch dazu sagen hätte müssen, die Variable beinhaltet eine Kommazahl. Daher bekomme ich mit deiner Methode einen Syntaxfehler.
Jup, dann wirst du ihn wohl internationalisieren müssen und zum Beispiel mit Debiansed in einen Punkt umwandeln.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

msmal
Beiträge: 14
Registriert: 22.11.2011 20:36:24

Re: while Schleife; Rechnung im Skript

Beitrag von msmal » 12.01.2012 21:06:10

Das Komma durch nen Punkt ersetzt hab ich schon.
Ich habs jetzt versucht zu verinfach und mal ohne Variable zu rechnen:

Code: Alles auswählen

writing_speed_without_unit_bytes=$(expr 25.1 * 1048576)
Dabei bekomme ich immer noch ein

Code: Alles auswählen

expr: non-integer argument
soweit ich jetzt herausgefunden habe, kann man mit bc das ganze rechnen.
Hat das jemand schonmal in einem Script angewendet?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: while Schleife; Rechnung im Skript

Beitrag von Cae » 12.01.2012 21:21:35

msmal hat geschrieben:soweit ich jetzt herausgefunden habe, kann man mit bc das ganze rechnen.
Hat das jemand schonmal in einem Script angewendet?
Ungefähr so:

Code: Alles auswählen

% echo '13.37 * 3.1415' | bc
42.0018
Wie ich schon oben schrieb, mit Nachkommastellen aufpassen, hier sind sie dabei, weil der Input auch welche beinhaltet.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

msmal
Beiträge: 14
Registriert: 22.11.2011 20:36:24

Re: while Schleife; Rechnung im Skript

Beitrag von msmal » 12.01.2012 22:22:43

Vielen vielen Dank, damit wäre mein zweites Problem tatsächlich schonmal gelöst.

Das erste Problem kann ich morgen erst testen.

Antworten