2010-04-22 7 views
5

Ho uno script cron su un host web condiviso che a volte viene ucciso. Mi piacerebbe fare un loop in bash che ci riprova se viene ucciso, perché la maggior parte delle volte lo farà. Ho problemi con la sintassi per la memorizzazione di un valore booleano: Ptipo booleano per il ciclo while 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 

Quindi lo script recupera da un processo ucciso va bene, ma una volta che è eseguito correttamente, il nuovo valore VAR non uccide il ciclo while.

Cosa sto sbagliando?

risposta

5

Prova

while [ $VAR -eq 0 ]; do 

0 e 1 sono entrambi considerati veri perché non sono stringhe nulle.

+1

E 'vero, ma per come l'ho scritto nel mio script, dovrebbe in realtà essere '-ne 1':) – user151841

5

Non c'è bisogno di una variabile di utilità, considerare l'utilizzo di:

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

Cosa significano i due punti dopo? – user151841

+2

Nessuna operazione: solo per soddisfare la sintassi di bash. –

1

In Bash, si può fare un condizionale numerica usando parentesi doppie piuttosto che una stringa condizionale, ma la logica è invertita:

#!/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

È possibile utilizzare /bin/true e /bin/false. Anche se while ! mysqldump .....; do :;done (soluzione di Jürgen Hötzel) sarebbe meglio in questo caso, ci sono altri casi in cui utilizzare true e false sono utili.

#!/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

Stavo per dire "mmmm. Non dovrebbe essere VAR =' true' AND var = 'false'? Perché - a meno di errore - VAR = true significa assegnare la stringa" true "a VAR. E VAR = false assegnando 'false' a VAR. "... ma No, perché mentre $ VAR esegue $ VAR. –

0

Mi piace 'finche' meglio per questo ...:

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