2010-04-22 20 views
5

Ich habe ein Cron-Skript auf einem freigegebenen Web-Host, der gelegentlich getötet wird. Ich würde gerne eine Schleife in bash machen, die es erneut versucht, wenn sie getötet wird, weil sie es meistens schafft. Ich habe Probleme mit der Syntax für einen Booleschen Wert zu speichern: PBoolescher Typ für while-Schleife in bash?

#!/bin/bash 
VAR=0; 

while [ $VAR ]; do 
    if nice -19 mysqldump -uuser -ppassword -h database.hostname.com --skip-opt --all --complete-insert --add-drop-table database_name > ~/file/system/path/filename.sql; then 
     VAR=1; 
    fi 
done 

Also das Skript von einem getöteten Prozess in Ordnung erholt, aber sobald es richtig laufen gelassen, der neue VAR Wert tötet nicht die while Schleife.

Was mache ich falsch?

Antwort

5

Versuchen

while [ $VAR -eq 0 ]; do 

0 und 1 beide wahr betrachtet, weil sie nicht null Strings sind. mit

+1

Das ist richtig, aber wie ich es in meinem Skript geschrieben, es sollte eigentlich '-ne sein 1':) – user151841

5

Sie keine Notwendigkeit, eine Hilfsvariable betrachten:

while ! mysqldump .....; do :;done 
+0

Was bedeutet der Doppelpunkt danach? – user151841

+2

Keine Operation: Nur um die Bash-Syntax zu erfüllen. –

1

In Bash können Sie ein numerische bedingten mit doppelseitigem Klammern anstatt einen String bedingten zu tun, aber die Logik invertiert:

#!/bin/bash 
VAR=1; 

while ((VAR)); do 
    if nice -19 mysqldump -uuser -ppassword -h database.hostname.com --skip-opt --all --complete-insert --add-drop-table database_name > ~/file/system/path/filename.sql; then 
     VAR=0; 
    fi 
done 
2

Sie könnten /bin/true und /bin/false verwenden. Obwohl while ! mysqldump .....; do :;done (Jürgen Hötzels Lösung) in diesem Fall besser wäre, gibt es andere Fälle, in denen true und false nützlich sind.

#!/bin/bash 
VAR=true 

while $VAR; do 
    if nice -19 mysqldump -uuser -ppassword -h database.hostname.com --skip-opt --all --complete-insert --add-drop-table database_name > ~/file/system/path/filename.sql; then 
    VAR=false 
    fi 
done 
+0

Ich wollte sagen "mmmm. Sollte es nicht VAR =' true' UND var = 'false' sein? Weil - sofern nicht der Fehler - VAR = true bedeutet die Zeichenfolge 'true' zu VAR. Und VAR = false bedeutet Zuweisen von 'false' zu VAR. "... aber Nein, weil $ VAR $ VAR ausführt. –

0

Ich mag 'bis' besser für diese ...:

i=0 until [ $_done ]; do echo stuff...; sleep 1; ((i++)); if [ "$i" -gt 9 ]; then _done=1 fi done