views:

77

answers:

4

I have a cron script on a shared web host that occasionally gets killed. I'd like to make a loop in bash that tries again if it gets killed, because most of the time it will make it. I'm having trouble with the syntax for storing a boolean value :P

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

So the script recovers from a killed process okay, but once it's run properly, the new VAR value doesn't kill the while loop.

What am I doing wrong?

+1  A: 

Try

while [ $VAR -eq 0 ]; do

0 and 1 are both considered True because they are not null strings.

KennyTM
That's right, but for how I wrote it in my script, it should actually be `-ne 1` :)
+1  A: 

No need to you a helper variable, consider using:

while ! mysqldump .....; do :;done
Jürgen Hötzel
What does the colon mean after do?
No operation: Just to satisfy bash syntax.
Jürgen Hötzel
A: 

In Bash, you can do a numeric conditional using double parentheses rather than a string conditional, but the logic is inverted:

#!/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
Dennis Williamson
A: 

You could use /bin/true and /bin/false. Although while ! mysqldump .....; do :;done (Jürgen Hötzel's solution) would be better in this case, there are other cases when using true and false are useful.

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