staging.inyokaproject.org

Alternative zu Endloschleife (while true) mit If

Status: Ungelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Hallo,

immer wenn ich in einem Shell-Script auf etwas warten muss, wo ich nicht abschätzen kann wie lange es dauert (z. B. den vollständigen Start einer Anwendung), verwende ich das hier

1
2
3
4
5
6
7
8
while true; do
 <bedingung abfragen>
 if [ bedingung nicht erfüllt ]; then
  sleep 10
 else
  break
 fi
done

Die Schleife beginnt, prüft ob eine vollständig geladen wurde. Wenn dem so ist wird mit 'break' die Schleife verlassen und der nächste Teil des Skriptes wird ausgeführt, wenn nicht wird 10 Sekunden gewartet und er beginnt von vorne. Das funktioniert erstmal soweit, die Frage ist aber ob es clever ist hier eine Endloschleife zu verwenden oder ob das auch eleganter zu lösen geht.

Friedrich

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax!

NORACSA

Anmeldungsdatum:
31. Januar 2010

Beiträge: 182

Warum fragst du die Bedingung nicht einfach als Schleifenbedingung ab?

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1162

Weil das dann nur einmal abgefragt wird und dann endet. Wie gesagt, das mache ich wenn ich nicht weiß wie lange ein Prozess dauern könnte. Daher verwende ich auch kein sleep. Außer es gibt die Möglichkeit die Bedingung im while abzufragen, aber nur nur einmal sondern endlos.

NORACSA

Anmeldungsdatum:
31. Januar 2010

Beiträge: 182

Fried-rich schrieb:

Weil das dann nur einmal abgefragt wird und dann endet. Wie gesagt, das mache ich wenn ich nicht weiß wie lange ein Prozess dauern könnte. Daher verwende ich auch kein sleep. Außer es gibt die Möglichkeit die Bedingung im while abzufragen, aber nur nur einmal sondern endlos.

Warum sollte die Bedingung nur einmal abgefragt werden? While ist ja kein if!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Zusätzlich: normalerweise ist ja eine Lösung mit Push statt Poll effizienter. Da gibt es aber keine allgemeine Lösung. Man kann u.U. nc nutzen, um zu prüfen, ob ein Port geöffnet ist, oder inotifywait um auf ein IO-Ereignis zu warten, etc.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Fried-rich schrieb:

[…] verwende ich das hier

1
2
3
4
5
6
7
8
while true; do
 <bedingung abfragen>
 if [ bedingung nicht erfüllt ]; then
  sleep 10
 else
  break
 fi
done

Ich mache das so:

until Bedingung erfüllt; do sleep 10 ; done 

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Du könntest auch einfach wait verwenden.

Hier auch nochmal ein Beispiel (in englisch): https://stackoverflow.com/questions/13296863/difference-between-wait-and-sleep

Antworten |