Repeat terminal command until specified output

I would like to define an alias that performs a command every x seconds until an underlying process gives a designated output. Then, the command should stop being run.

Is this possible, and if so, how? Help is much appreciated.

I'm almost satisfied with

alias test1='while true; do <command>; sleep 1; done'

except I have to manually stop it, and can therefore not make it execute a new command once finished.

The reason for the question: Dropbox synchronizes poorly at work. Sometimes, I have to restart it. I would like to do that using a command which also tells when the sync is done, e.g. by

alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'

I would like the repetition stopped when Dropbox outputs 'Up to date'.


Set a condition for the while loop

If you replace

while true

by:

while [ "$(dropbox status)" != "Up to date" ]

it works as you describe.

The command

To stop/start Dropbox and finish after synchronizing is done becomes then:

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do dropbox status; sleep 1; done

Or better (to prevent doubling dropbox status):

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do echo "Updating"; sleep 1 ; done && echo "Finished"

Explanation

while true is waiting for a break condition inside the loop (which never comes), but while [ "$(dropbox status)" != "Up to date" makes the loop break if dropbox status returns Up to date


As Jacob says, use the condition on the loop. I suggest an until loop:

dropbox stop && dropbox start && 
until dropbox status | grep -q "Up to date";
do 
  sleep 1; 
done

until runs until the command returns true, that's when dropbox status output contains Up to date.


Define it as a function in your $HOME/.bashrc

syncDropBox()
{
dropbox stop && \
dropbox start && 
while true; 
do 
  STAT="$(dropbox status)"
  if [ "$STAT" = "Up to date"  ] ; then
  break # or add more commands to finilize the process
  fi
  sleep 1; 
done
}

Now, I don't have dropbox cmd app, so depending on the way it outputs status, you may or may not process it with AWK or grep.

But point being that you can either store output to value or redirect output to another command, and evaluate them. Once we get specific output string - break