2010-04-22 15 views
5

Tengo un script cron en un host web compartido que ocasionalmente muere. Me gustaría hacer un ciclo en bash que vuelva a intentarlo si lo matan, porque la mayoría de las veces lo hará. Tengo problemas con la sintaxis para almacenar un valor booleano: Ptipo booleano para while loop en 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 

Así que el guión se recupera de un proceso matado bien, pero una vez que se ejecute correctamente, el nuevo valor VAR no mata el bucle while.

¿Qué estoy haciendo mal?

Respuesta

5

Trate

while [ $VAR -eq 0 ]; do 

0 y 1 son ambos considerados verdadera porque no son cadenas vacías.

+1

Así es, pero por la forma en que lo escribí en mi escritura, que en realidad debería ser '1' -ne:) – user151841

5

No hay necesidad de que una variable de ayuda, considere el uso de:

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

¿Qué significa el colon después de hacer? – user151841

+2

Sin operación: solo para satisfacer la sintaxis de bash. –

1

En Bash, se puede hacer una condicional numérica usando paréntesis dobles en vez de una cadena condicional, pero se invierte la lógica:

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

Puede usar /bin/true y /bin/false. Aunque while ! mysqldump .....; do :;done (solución de Jürgen Hötzel) sería mejor en este caso, existen otros casos en que el uso de true y false son útiles.

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

Iba a decir "mmmm. ¿No debería ser VAR =' true' AND var = 'false'? Porque - a menos que el error - VAR = true significa asignar la cadena 'verdadero' a VAR. Y VAR = falso significa asignando 'falso' a VAR. "... pero no, porque mientras $ VAR ejecuta $ VAR. –

0

Me gusta 'hasta' mejor para este ...:

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