2016-03-20 15 views
0

Im Ändern eines vorhandenen Bash-Skript und einige Probleme bekommen die While-Schleife sich richtig verhalten. Dies ist der ursprüngliche CodeCompound-Bedingung in einer Bash-While-Schleife

while ! /usr/bin/executable1 
do 
    # executable1 returned an error. So sleep for some time try again 
    sleep 2 
done 

ich diese

while ! /usr/bin/executable1 && ! $(myfunc) 
do 
    # executable1 and myfunc both were unsuccessful. So sleep for some time 
    sleep 2 
done 

der folgenden ändern möchten executable1 bei Erfolg 0 und 1 bei einem Fehler zurückgibt. Ich verstehe, dass „true“ in bash auf 0 wertet so ist, warum das ursprüngliche Skript bis ausführbare Looping halten würde Erfolg zurück

Dementsprechend myfunc wie diese

myfunc() 
{ 
    # Check if file exists. If exits, return 0, If not, return 1 
    if [ -e someFile ]; then 
     return 0 
    fi 

    return 1 
} 

Ich stelle fest, codiert, dass das meine neue while-Schleife tut scheint nicht ausführbar zu sein1. Es ruft immer myfunc() auf und verlässt dann sofort die Schleife. Was mache ich falsch?

ich verschiedene Möglichkeiten, die Codierung der while-Schleife (mit (()), [], [[]] usw.) versucht, aber nichts, um es

+0

Es ist nicht klar, warum Sie denken, 'executable1' ist nicht ausgeführt; Es muss * ausgeführt werden, um (aufgrund von && ') zu entscheiden, ob" myfunc "ausgeführt werden soll oder nicht. – chepner

+0

Ausführbare Datei 1, wenn sie selbst ausgeführt wird, dauert etwa 8-10 Sekunden. (Es läuft tatsächlich "ntpdate") Also bin ich mir ziemlich sicher, dass es nicht aufgerufen wird, weil die while-Schleife fast sofort zurückkehrt. –

+0

Ich denke, dass ich das Problem in meinem Code herausgefunden habe. In bash stellt sich heraus, dass boolescher Wert wahr 0 ergibt und boolescher falscher Wert 1 ist. Also while ((0)) ist eigentlich eine unendliche while-Schleife. Was ich tun möchte, ist die While-Schleife eingeben, wenn die Datei nicht gefunden wird. Also sollte ich 1 (false) zurückgeben, wenn die Datei nicht gefunden wurde, und 0 (true), wenn die Datei gefunden wurde. Sobald ich diese Änderung vorgenommen habe, hat alles funktioniert –

Antwort

1

zu beheben scheint Sie $(...) nicht brauchen eine Funktion aufzurufen , nur um seine Standardausgabe zu erfassen. Sie wollen einfach

while ! /usr/bin/executable1 && ! myfunc 
do 
    sleep 2 
done 

Beachten Sie, dass myfunc auch einfacher

myfunc() { 
    [ -e someFile ] 
} 

geschrieben werden kann oder sogar (in bash)

myfunc() [[ -e someFile ]] 

So oder so, es ist fast nicht wert myfunc separat definiert; nur

while ! /usr/bin/executable1 && ! [[ -e someFile ]] 
do 
    sleep 2 
done 

verwenden Es könnte auch einfacher sein, eine until Schleife zu verwenden:

until /usr/bin/executable1 || [[ -e someFile ]]; do 
    sleep 2 
done 
+0

Ive nur die wesentlichen Details meines Codes in dieser Frage zur Verfügung gestellt. Das myfunc() ist die Realität, die viele Dinge tut, aber die Hauptsache ist, dass es dem Anrufer 1 oder 0 zurückgibt. –

Verwandte Themen